home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / programming / other / jikes / src / javaact.cpp < prev    next >
C/C++ Source or Header  |  1999-05-14  |  109KB  |  4,548 lines

  1. // $Id: javaact.cpp,v 1.6 1999/03/08 18:04:49 shields Exp $
  2. #line 427 "java.g"
  3. //
  4. // This software is subject to the terms of the IBM Jikes Compiler 
  5. // License Agreement available at the following URL:
  6. // http://www.ibm.com/research/jikes.
  7. // Copyright (C) 1996, 1999, International Business Machines Corporation
  8. // and others.  All Rights Reserved.
  9. // You must accept the terms of that agreement to use this software.
  10. //
  11.  
  12. #include "config.h"
  13. #include "parser.h"
  14. #include "ast.h"
  15.  
  16. #undef HEADERS
  17. #include "javaact.h"
  18.  
  19. //****************************************************************************//
  20. //****************************************************************************//
  21. //*                                                                          *//
  22. //* Below, we show each rule of the Java grammar together with the semantic  *//
  23. //* action that is invoked when the parser performs a reduction by that rule.*//
  24. //*                                                                          *//
  25. //****************************************************************************//
  26. //****************************************************************************//
  27.  
  28.  
  29. // 
  30. // Rule 1:  Goal -> CompilationUnit
  31. //
  32. #line 459 "java.g"
  33. //
  34. // Given a rule of the form A ::= x1 x2 ... xn        n >= 1
  35. //
  36. // Do nothing - Whatever Ast was produced for x1 is inherited by A.
  37. //
  38. void Parser::BadAction(void) { assert(0); }
  39. void Parser::NoAction(void) {}
  40.  
  41. // 
  42. // Rule 2:  Goal ::= BodyMarker ConstructorBody
  43. //
  44. #line 471 "java.g"
  45. //
  46. // This rule was added to allow the parser to recognize the body of a
  47. // funtion (constructor or method, as the definition of the body of a
  48. // method is subsumed by the definition of the body of a constructor)
  49. // out of context. Note that the artificial terminal BodyMarker is
  50. // added here to prevent an ordinary parse from accepting a body as
  51. // a valid input - i.e., to recognize a body out-of-context, the
  52. // BodyMarker terminal must be inserted in front of the input stream
  53. // containing the body in question.
  54. //
  55. void Parser::Act2(void)
  56. {
  57.     Sym(1) = Sym(2);
  58. }
  59.  
  60. // 
  61. // Rule 3:  Literal ::= IntegerLiteral
  62. //
  63. #line 496 "java.g"
  64. void Parser::Act3(void)
  65. {
  66.     Sym(1) = ast_pool -> NewIntegerLiteral(Token(1));
  67. }
  68.  
  69. // 
  70. // Rule 4:  Literal ::= LongLiteral
  71. //
  72. #line 505 "java.g"
  73. void Parser::Act4(void)
  74. {
  75.     Sym(1) = ast_pool -> NewLongLiteral(Token(1));
  76. }
  77.  
  78. // 
  79. // Rule 5:  Literal ::= FloatingPointLiteral
  80. //
  81. #line 514 "java.g"
  82. void Parser::Act5(void)
  83. {
  84.     Sym(1) = ast_pool -> NewFloatingPointLiteral(Token(1));
  85. }
  86.  
  87. // 
  88. // Rule 6:  Literal ::= DoubleLiteral
  89. //
  90. #line 523 "java.g"
  91. void Parser::Act6(void)
  92. {
  93.     Sym(1) = ast_pool -> NewDoubleLiteral(Token(1));
  94. }
  95.  
  96. //
  97. // Rule 7:  Literal -> BooleanLiteral
  98. //
  99. // void NoAction(void);
  100. //
  101.  
  102. // 
  103. // Rule 8:  Literal ::= CharacterLiteral
  104. //
  105. #line 536 "java.g"
  106. void Parser::Act8(void)
  107. {
  108.     Sym(1) = ast_pool -> NewCharacterLiteral(Token(1));
  109. }
  110.  
  111. // 
  112. // Rule 9:  Literal ::= StringLiteral
  113. //
  114. #line 545 "java.g"
  115. void Parser::Act9(void)
  116. {
  117.     Sym(1) = ast_pool -> NewStringLiteral(Token(1));
  118. }
  119.  
  120. // 
  121. // Rule 10:  Literal ::= null
  122. //
  123. #line 554 "java.g"
  124. void Parser::Act10(void)
  125. {
  126.     Sym(1) = ast_pool -> NewNullLiteral(Token(1));
  127. }
  128.  
  129. // 
  130. // Rule 11:  BooleanLiteral ::= true
  131. //
  132. #line 563 "java.g"
  133. void Parser::Act11(void)
  134. {
  135.     Sym(1) = ast_pool -> NewTrueLiteral(Token(1));
  136. }
  137.  
  138. // 
  139. // Rule 12:  BooleanLiteral ::= false
  140. //
  141. #line 572 "java.g"
  142. void Parser::Act12(void)
  143. {
  144.     Sym(1) = ast_pool -> NewFalseLiteral(Token(1));
  145. }
  146.  
  147. //
  148. // Rule 13:  Type -> PrimitiveType
  149. //
  150. // void NoAction(void);
  151. //
  152.  
  153. //
  154. // Rule 14:  Type -> ReferenceType
  155. //
  156. // void NoAction(void);
  157. //
  158.  
  159. //
  160. // Rule 15:  PrimitiveType -> NumericType
  161. //
  162. // void NoAction(void);
  163. //
  164.  
  165. // 
  166. // Rule 16:  PrimitiveType ::= boolean
  167. //
  168. #line 595 "java.g"
  169. void Parser::Act16(void)
  170. {
  171.     Sym(1) = ast_pool -> NewPrimitiveType(Ast::BOOLEAN, Token(1));
  172. }
  173.  
  174. //
  175. // Rule 17:  NumericType -> IntegralType
  176. //
  177. // void NoAction(void);
  178. //
  179.  
  180. //
  181. // Rule 18:  NumericType -> FloatingPointType
  182. //
  183. // void NoAction(void);
  184. //
  185.  
  186. // 
  187. // Rule 19:  IntegralType ::= byte
  188. //
  189. #line 612 "java.g"
  190. void Parser::Act19(void)
  191. {
  192.     Sym(1) = ast_pool -> NewPrimitiveType(Ast::BYTE, Token(1));
  193. }
  194.  
  195. // 
  196. // Rule 20:  IntegralType ::= short
  197. //
  198. #line 621 "java.g"
  199. void Parser::Act20(void)
  200. {
  201.     Sym(1) = ast_pool -> NewPrimitiveType(Ast::SHORT, Token(1));
  202. }
  203.  
  204. // 
  205. // Rule 21:  IntegralType ::= int
  206. //
  207. #line 630 "java.g"
  208. void Parser::Act21(void)
  209. {
  210.     Sym(1) = ast_pool -> NewPrimitiveType(Ast::INT, Token(1));
  211. }
  212.  
  213. // 
  214. // Rule 22:  IntegralType ::= long
  215. //
  216. #line 639 "java.g"
  217. void Parser::Act22(void)
  218. {
  219.     Sym(1) = ast_pool -> NewPrimitiveType(Ast::LONG, Token(1));
  220. }
  221.  
  222. // 
  223. // Rule 23:  IntegralType ::= char
  224. //
  225. #line 648 "java.g"
  226. void Parser::Act23(void)
  227. {
  228.     Sym(1) = ast_pool -> NewPrimitiveType(Ast::CHAR, Token(1));
  229. }
  230.  
  231. // 
  232. // Rule 24:  FloatingPointType ::= float
  233. //
  234. #line 657 "java.g"
  235. void Parser::Act24(void)
  236. {
  237.     Sym(1) = ast_pool -> NewPrimitiveType(Ast::FLOAT, Token(1));
  238. }
  239.  
  240. // 
  241. // Rule 25:  FloatingPointType ::= double
  242. //
  243. #line 666 "java.g"
  244. void Parser::Act25(void)
  245. {
  246.     Sym(1) = ast_pool -> NewPrimitiveType(Ast::DOUBLE, Token(1));
  247. }
  248.  
  249. //
  250. // Rule 26:  ReferenceType -> ClassOrInterfaceType
  251. //
  252. // void NoAction(void);
  253. //
  254.  
  255. //
  256. // Rule 27:  ReferenceType -> ArrayType
  257. //
  258. // void NoAction(void);
  259. //
  260.  
  261. //
  262. // Rule 28:  ClassOrInterfaceType -> Name
  263. //
  264. // void NoAction(void);
  265. //
  266.  
  267. // 
  268. // Rule 29:  ArrayType ::= PrimitiveType Dims
  269. //
  270. #line 695 "java.g"
  271. void Parser::MakeArrayType(void)
  272. {
  273.     AstArrayType *p = ast_pool -> NewArrayType();
  274.     p -> type     = Sym(1);
  275.     //
  276.     // The list of modifiers is guaranteed not empty
  277.     //
  278.     {   
  279.         AstListNode *tail = (AstListNode *) Sym(2);
  280.         p -> AllocateBrackets(tail -> index + 1);
  281.         AstListNode *root = tail;
  282.         do
  283.         {
  284.             root = root -> next;
  285.             p -> AddBrackets((AstBrackets *) root -> element);
  286.         } while(root != tail);
  287.         FreeCircularList(tail);
  288.     }
  289.     Sym(1) = p;
  290. }
  291.  
  292. //
  293. // Rule 30:  ArrayType ::= Name Dims
  294. //
  295. // void MakeArrayType(void);
  296. //
  297.  
  298. //
  299. // Rule 31:  ClassType -> ClassOrInterfaceType
  300. //
  301. // void NoAction(void);
  302. //
  303.  
  304. //
  305. // Rule 32:  InterfaceType -> ClassOrInterfaceType
  306. //
  307. // void NoAction(void);
  308. //
  309.  
  310. //
  311. // Rule 33:  Name -> SimpleName
  312. //
  313. // void NoAction(void);
  314. //
  315.  
  316. //
  317. // Rule 34:  Name -> QualifiedName
  318. //
  319. // void NoAction(void);
  320. //
  321.  
  322. // 
  323. // Rule 35:  SimpleName ::= Identifier
  324. //
  325. #line 745 "java.g"
  326. void Parser::MakeSimpleName(void)
  327. {
  328.     Sym(1) = ast_pool -> NewSimpleName(Token(1));
  329. }
  330.  
  331. // 
  332. // Rule 36:  QualifiedName ::= Name DOT Identifier
  333. //
  334. #line 754 "java.g"
  335. void Parser::MakeFieldAccess(void)
  336.     AstFieldAccess *p = ast_pool -> NewFieldAccess();
  337.     p -> base = (AstExpression *) Sym(1);
  338.     p -> dot_token = Token(2);
  339.     p -> identifier_token = Token(3);
  340.     Sym(1) = p;
  341. }
  342.  
  343. // 
  344. // Rule 37:  CompilationUnit ::= PackageDeclarationopt ImportDeclarationsopt TypeDeclarationsopt
  345. //
  346. #line 769 "java.g"
  347. void Parser::Act37(void)
  348. {
  349.     AstCompilationUnit *p = ast_pool -> NewCompilationUnit();
  350.     p -> package_declaration_opt = (AstPackageDeclaration *) Sym(1);
  351.     if (Sym(2) != NULL)
  352.     {
  353.         AstListNode *tail = (AstListNode *) Sym(2);
  354.         p -> AllocateImportDeclarations(tail -> index + 1);
  355.         AstListNode *root = tail;
  356.         do
  357.         {
  358.             root = root -> next;
  359.             p -> AddImportDeclaration((AstImportDeclaration *) root -> element);
  360.         } while(root != tail);
  361.         FreeCircularList(tail);
  362.     }
  363.     if (Sym(3) != NULL)
  364.     {
  365.         AstListNode *tail = (AstListNode *) Sym(3);
  366.         p -> AllocateTypeDeclarations(tail -> index + 1);
  367.         AstListNode *root = tail;
  368.         do
  369.         {
  370.             root = root -> next;
  371.             p -> AddTypeDeclaration(root -> element);
  372.         } while(root != tail);
  373.         FreeCircularList(tail);
  374.     }
  375.     Sym(1) = p;
  376. }
  377.  
  378. // 
  379. // Rule 38:  ImportDeclarations ::= ImportDeclaration
  380. //
  381. #line 804 "java.g"
  382. //
  383. // Note that the list is circular so as to preserve the order of the elements
  384. //
  385. void Parser::Act38(void)
  386. {
  387.     AstListNode *p = AllocateListNode();
  388.     p -> next = p;
  389.     p -> element = Sym(1);
  390.     p -> index = 0;
  391.  
  392.     Sym(1) = p;
  393. }
  394.  
  395. // 
  396. // Rule 39:  ImportDeclarations ::= ImportDeclarations ImportDeclaration
  397. //
  398. #line 821 "java.g"
  399. //
  400. // Note that the list is circular so as to preserve the order of the elements
  401. //
  402. void Parser::Act39(void)
  403. {
  404.     AstListNode *tail = (AstListNode *) Sym(1);
  405.  
  406.     AstListNode *p = AllocateListNode();
  407.     p -> element = Sym(2);
  408.     p -> index = tail -> index + 1;
  409.  
  410.     p -> next = tail -> next;
  411.     tail -> next = p;
  412.  
  413.     Sym(1) = p;
  414. }
  415.  
  416. // 
  417. // Rule 40:  TypeDeclarations ::= TypeDeclaration
  418. //
  419. #line 842 "java.g"
  420. //
  421. // Note that the list is circular so as to preserve the order of the elements
  422. //
  423. void Parser::Act40(void)
  424. {
  425.     AstListNode *p = AllocateListNode();
  426.     p -> next = p;
  427.     p -> element = Sym(1);
  428.     p -> index = 0;
  429.  
  430.     Sym(1) = p;
  431. }
  432.  
  433. // 
  434. // Rule 41:  TypeDeclarations ::= TypeDeclarations TypeDeclaration
  435. //
  436. #line 859 "java.g"
  437. //
  438. // Note that the list is circular so as to preserve the order of the elements
  439. //
  440. void Parser::Act41(void)
  441. {
  442.     AstListNode *tail = (AstListNode *) Sym(1);
  443.  
  444.     AstListNode *p = AllocateListNode();
  445.     p -> element = Sym(2);
  446.     p -> index = tail -> index + 1;
  447.  
  448.     p -> next = tail -> next;
  449.     tail -> next = p;
  450.  
  451.     Sym(1) = p;
  452. }
  453.  
  454. // 
  455. // Rule 42:  PackageDeclaration ::= package Name PackageHeaderMarker SEMICOLON
  456. //
  457. #line 880 "java.g"
  458. void Parser::Act42(void)
  459. {
  460.     AstPackageDeclaration *p = ast_pool -> NewPackageDeclaration();
  461.     p -> package_token   = Token(1);
  462.     p -> name            = (AstExpression *) Sym(2);
  463.     p -> semicolon_token = Token(3);
  464.     Sym(1) = p;
  465. }
  466.  
  467. //
  468. // Rule 43:  ImportDeclaration -> SingleTypeImportDeclaration
  469. //
  470. // void NoAction(void);
  471. //
  472.  
  473. //
  474. // Rule 44:  ImportDeclaration -> TypeImportOnDemandDeclaration
  475. //
  476. // void NoAction(void);
  477. //
  478.  
  479. // 
  480. // Rule 45:  SingleTypeImportDeclaration ::= import Name SEMICOLON
  481. //
  482. #line 901 "java.g"
  483. void Parser::Act45(void)
  484. {
  485.     AstImportDeclaration *p = ast_pool -> NewImportDeclaration();
  486.     p -> import_token    = Token(1);
  487.     p -> name            = (AstExpression *) Sym(2);
  488.     p -> star_token_opt  = 0;
  489.     p -> semicolon_token = Token(3);
  490.     Sym(1) = p;
  491. }
  492.  
  493. // 
  494. // Rule 46:  TypeImportOnDemandDeclaration ::= import Name DOT MULTIPLY SEMICOLON
  495. //
  496. #line 915 "java.g"
  497. void Parser::Act46(void)
  498. {
  499.     AstImportDeclaration *p = ast_pool -> NewImportDeclaration();
  500.     p -> import_token         = Token(1);
  501.     p -> name                 = (AstExpression *) Sym(2);
  502.     p -> star_token_opt       = Token(4);
  503.     p -> semicolon_token      = Token(5);
  504.     Sym(1) = p;
  505. }
  506.  
  507. //
  508. // Rule 47:  TypeDeclaration -> ClassDeclaration
  509. //
  510. // void NoAction(void);
  511. //
  512.  
  513. //
  514. // Rule 48:  TypeDeclaration -> InterfaceDeclaration
  515. //
  516. // void NoAction(void);
  517. //
  518.  
  519. // 
  520. // Rule 49:  TypeDeclaration ::= SEMICOLON
  521. //
  522. #line 937 "java.g"
  523. void Parser::Act49(void)
  524. {
  525.     Sym(1) = ast_pool -> NewEmptyDeclaration(Token(1));
  526. }
  527.  
  528. // 
  529. // Rule 50:  Modifiers ::= Modifier
  530. //
  531. #line 948 "java.g"
  532. //
  533. // Note that the list is circular so as to preserve the order of the elements
  534. //
  535. void Parser::Act50(void)
  536. {
  537.     AstListNode *p = AllocateListNode();
  538.     p -> next = p;
  539.     p -> element = Sym(1);
  540.     p -> index = 0;
  541.  
  542.     Sym(1) = p;
  543. }
  544.  
  545. // 
  546. // Rule 51:  Modifiers ::= Modifiers Modifier
  547. //
  548. #line 965 "java.g"
  549. //
  550. // Note that the list is circular so as to preserve the order of the elements
  551. //
  552. void Parser::Act51(void)
  553. {
  554.     AstListNode *tail = (AstListNode *) Sym(1);
  555.  
  556.     AstListNode *p = AllocateListNode();
  557.     p -> element = Sym(2);
  558.     p -> index = tail -> index + 1;
  559.  
  560.     p -> next = tail -> next;
  561.     tail -> next = p;
  562.  
  563.     Sym(1) = p;
  564. }
  565.  
  566. // 
  567. // Rule 52:  Modifier ::= public
  568. //
  569. #line 986 "java.g"
  570. void Parser::Act52(void)
  571. {
  572.     Sym(1) = ast_pool -> NewModifier(Ast::PUBLIC, Token(1));
  573. }
  574.  
  575. // 
  576. // Rule 53:  Modifier ::= protected
  577. //
  578. #line 995 "java.g"
  579. void Parser::Act53(void)
  580. {
  581.     Sym(1) = ast_pool -> NewModifier(Ast::PROTECTED, Token(1));
  582. }
  583.  
  584. // 
  585. // Rule 54:  Modifier ::= private
  586. //
  587. #line 1004 "java.g"
  588. void Parser::Act54(void)
  589. {
  590.     Sym(1) = ast_pool -> NewModifier(Ast::PRIVATE, Token(1));
  591. }
  592.  
  593. // 
  594. // Rule 55:  Modifier ::= static
  595. //
  596. #line 1013 "java.g"
  597. void Parser::Act55(void)
  598. {
  599.     Sym(1) = ast_pool -> NewModifier(Ast::STATIC, Token(1));
  600. }
  601.  
  602. // 
  603. // Rule 56:  Modifier ::= abstract
  604. //
  605. #line 1022 "java.g"
  606. void Parser::Act56(void)
  607. {
  608.     Sym(1) = ast_pool -> NewModifier(Ast::ABSTRACT, Token(1));
  609. }
  610.  
  611. // 
  612. // Rule 57:  Modifier ::= final
  613. //
  614. #line 1031 "java.g"
  615. void Parser::Act57(void)
  616. {
  617.     Sym(1) = ast_pool -> NewModifier(Ast::FINAL, Token(1));
  618. }
  619.  
  620. // 
  621. // Rule 58:  Modifier ::= native
  622. //
  623. #line 1040 "java.g"
  624. void Parser::Act58(void)
  625. {
  626.     Sym(1) = ast_pool -> NewModifier(Ast::NATIVE, Token(1));
  627. }
  628.  
  629. // 
  630. // Rule 59:  Modifier ::= strictfp
  631. //
  632. #line 1049 "java.g"
  633. void Parser::Act59(void)
  634. {
  635.     Sym(1) = ast_pool -> NewModifier(Ast::STRICTFP, Token(1));
  636. }
  637.  
  638. // 
  639. // Rule 60:  Modifier ::= synchronized
  640. //
  641. #line 1058 "java.g"
  642. void Parser::Act60(void)
  643. {
  644.     Sym(1) = ast_pool -> NewModifier(Ast::SYNCHRONIZED, Token(1));
  645. }
  646.  
  647. // 
  648. // Rule 61:  Modifier ::= transient
  649. //
  650. #line 1067 "java.g"
  651. void Parser::Act61(void)
  652. {
  653.     Sym(1) = ast_pool -> NewModifier(Ast::TRANSIENT, Token(1));
  654. }
  655.  
  656. // 
  657. // Rule 62:  Modifier ::= volatile
  658. //
  659. #line 1076 "java.g"
  660. void Parser::Act62(void)
  661. {
  662.     Sym(1) = ast_pool -> NewModifier(Ast::VOLATILE, Token(1));
  663. }
  664.  
  665. // 
  666. // Rule 63:  ClassDeclaration ::= Modifiersopt class Identifier Superopt Interfacesopt ClassBody
  667. //
  668. #line 1092 "java.g"
  669. void Parser::Act63(void)
  670. {
  671.     AstClassDeclaration *p = ast_pool -> NewClassDeclaration();
  672.     if (Sym(1) != NULL)
  673.     {
  674.         AstListNode *tail = (AstListNode *) Sym(1);
  675.         p -> AllocateClassModifiers(tail -> index + 1);
  676.         AstListNode *root = tail;
  677.         do
  678.         {
  679.             root = root -> next;
  680.             p -> AddClassModifier((AstModifier *) root -> element);
  681.         } while(root != tail);
  682.         FreeCircularList(tail);
  683.     }
  684.     p -> class_token          = Token(2);
  685.     p -> identifier_token     = Token(3);
  686.     p -> super_opt            = (AstExpression *) Sym(4);
  687.     if (Sym(5) != NULL)
  688.     {
  689.         AstListNode *tail = (AstListNode *) Sym(5);
  690.         p -> AllocateInterfaces(tail -> index + 1);
  691.         AstListNode *root = tail;
  692.         do
  693.         {
  694.             root = root -> next;
  695.             p -> AddInterface((AstExpression *) root -> element);
  696.         } while(root != tail);
  697.         FreeCircularList(tail);
  698.     }
  699.     p -> class_body = (AstClassBody *) Sym(6);
  700.     Sym(1) = p;
  701. }
  702.  
  703. // 
  704. // Rule 64:  Super ::= extends ClassType
  705. //
  706. #line 1130 "java.g"
  707. void Parser::SetSym1ToSym2(void) { Sym(1) = Sym(2); }
  708.  
  709. //
  710. // Rule 65:  Interfaces ::= implements InterfaceTypeList
  711. //
  712. // void SetSym1ToSym2(void);
  713. //
  714.  
  715. // 
  716. // Rule 66:  InterfaceTypeList ::= InterfaceType
  717. //
  718. #line 1143 "java.g"
  719. //
  720. // Note that the list is circular so as to preserve the order of the elements
  721. //
  722. void Parser::Act66(void)
  723. {
  724.     AstListNode *p = AllocateListNode();
  725.     p -> next = p;
  726.     p -> element = Sym(1);
  727.     p -> index = 0;
  728.  
  729.     Sym(1) = p;
  730. }
  731.  
  732. // 
  733. // Rule 67:  InterfaceTypeList ::= InterfaceTypeList COMMA InterfaceType
  734. //
  735. #line 1160 "java.g"
  736. //
  737. // Note that the list is circular so as to preserve the order of the elements
  738. //
  739. void Parser::Act67(void)
  740. {
  741.     AstListNode *tail = (AstListNode *) Sym(1);
  742.  
  743.     AstListNode *p = AllocateListNode();
  744.     p -> element = Sym(3);
  745.     p -> index = tail -> index + 1;
  746.  
  747.     p -> next = tail -> next;
  748.     tail -> next = p;
  749.  
  750.     Sym(1) = p;
  751. }
  752.  
  753. // 
  754. // Rule 68:  ClassBody ::= LBRACE ClassBodyDeclarationsopt RBRACE
  755. //
  756. #line 1181 "java.g"
  757. void Parser::Act68(void)
  758. {
  759.     AstClassBody *p = ast_pool -> NewClassBody();
  760.     if (parse_header_only)
  761.         p -> mark_unparsed();
  762.  
  763.     p -> left_brace_token = Token(1);
  764.     if (Sym(2) != NULL)
  765.     {
  766.         int num_instance_variables = 0,
  767.             num_class_variables = 0,
  768.             num_methods = 0,
  769.             num_constructors = 0,
  770.             num_static_initializers = 0,
  771.             num_inner_classes = 0,
  772.             num_inner_interfaces = 0,
  773.             num_blocks = 0,
  774.             num_empty_declarations = 0;
  775.  
  776.         AstListNode *tail = (AstListNode *) Sym(2);
  777.         p -> AllocateClassBodyDeclarations(tail -> index + 1);
  778.         AstListNode *root = tail;
  779.         do
  780.         {
  781.             root = root -> next;
  782.             p -> AddClassBodyDeclaration(root -> element);
  783.  
  784.             AstFieldDeclaration *field_declaration = root -> element -> FieldDeclarationCast();
  785.             if (field_declaration)
  786.             {
  787.                 for (int i = 0; i < field_declaration -> NumVariableModifiers(); i++)
  788.                 {
  789.                     if (field_declaration -> VariableModifier(i) -> kind == Ast::STATIC)
  790.                     {
  791.                         field_declaration -> MarkStatic();
  792.                         break;
  793.                     }
  794.                 }
  795.                 if (field_declaration -> StaticFieldCast())
  796.                      num_class_variables++;
  797.                 else num_instance_variables++;
  798.             }
  799.             else if (root -> element -> MethodDeclarationCast())
  800.             {
  801.                 num_methods++;
  802.             }
  803.             else if (root -> element -> ConstructorDeclarationCast())
  804.             {
  805.                 num_constructors++;
  806.             }
  807.             else if (root -> element -> StaticInitializerCast())
  808.             {
  809.                 num_static_initializers++;
  810.             }
  811.             else if (root -> element -> ClassDeclarationCast())
  812.             {
  813.                 num_inner_classes++;
  814.             }
  815.             else if (root -> element -> InterfaceDeclarationCast())
  816.             {
  817.                 num_inner_interfaces++;
  818.             }
  819.             else if (root -> element -> BlockCast())
  820.             {
  821.                 num_blocks++;
  822.             }
  823.             else num_empty_declarations++;
  824.         } while(root != tail);
  825.  
  826.         p -> AllocateInstanceVariables(num_instance_variables);
  827.         p -> AllocateClassVariables(num_class_variables);
  828.         p -> AllocateMethods(num_methods);
  829.         p -> AllocateConstructors(num_constructors);
  830.         p -> AllocateStaticInitializers(num_static_initializers);
  831.         p -> AllocateNestedClasses(num_inner_classes);
  832.         p -> AllocateNestedInterfaces(num_inner_interfaces);
  833.         p -> AllocateBlocks(num_blocks);
  834.         p -> AllocateEmptyDeclarations(num_empty_declarations);
  835.  
  836.         root = tail;
  837.         do
  838.         {
  839.             root = root -> next;
  840.  
  841.             AstFieldDeclaration *field_declaration;
  842.             AstMethodDeclaration *method_declaration;
  843.             AstConstructorDeclaration *constructor_declaration;
  844.             AstStaticInitializer *static_initializer;
  845.             AstClassDeclaration *class_declaration;
  846.             AstInterfaceDeclaration *interface_declaration;
  847.             AstBlock *block;
  848.  
  849.             if (field_declaration = root -> element -> FieldDeclarationCast())
  850.             {
  851.                 if (field_declaration -> StaticFieldCast())
  852.                      p -> AddClassVariable(field_declaration);
  853.                 else p -> AddInstanceVariable(field_declaration);
  854.             }
  855.             else if (method_declaration = root -> element -> MethodDeclarationCast())
  856.             {
  857.                 p -> AddMethod(method_declaration);
  858.             }
  859.             else if (constructor_declaration = root -> element -> ConstructorDeclarationCast())
  860.             {
  861.                 p -> AddConstructor(constructor_declaration);
  862.             }
  863.             else if (static_initializer = root -> element -> StaticInitializerCast())
  864.             {
  865.                 p -> AddStaticInitializer(static_initializer);
  866.             }
  867.             else if (class_declaration = root -> element -> ClassDeclarationCast())
  868.             {
  869.                 p -> AddNestedClass(class_declaration);
  870.             }
  871.             else if (interface_declaration = root -> element -> InterfaceDeclarationCast())
  872.             {
  873.                 p -> AddNestedInterface(interface_declaration);
  874.             }
  875.             else if (block = root -> element -> BlockCast())
  876.             {
  877.                 p -> AddBlock(block);
  878.             }
  879.             else // assert(block = root -> element -> EmptyDeclarationCast())
  880.             {
  881.                 p -> AddEmptyDeclaration((AstEmptyDeclaration *) root -> element);
  882.             }
  883.         } while(root != tail);
  884.         FreeCircularList(tail);
  885.     }
  886.     p -> right_brace_token = Token(3);
  887.     p -> pool = body_pool; // from now on, this is the storage pool to use for this type
  888.     Sym(1) = p;
  889. }
  890.  
  891. // 
  892. // Rule 69:  ClassBodyDeclarations ::= ClassBodyDeclaration
  893. //
  894. #line 1319 "java.g"
  895. //
  896. // Note that the list is circular so as to preserve the order of the elements
  897. //
  898. void Parser::Act69(void)
  899. {
  900.     AstListNode *p = AllocateListNode();
  901.     p -> next = p;
  902.     p -> element = Sym(1);
  903.     p -> index = 0;
  904.  
  905.     Sym(1) = p;
  906. }
  907.  
  908. // 
  909. // Rule 70:  ClassBodyDeclarations ::= ClassBodyDeclarations ClassBodyDeclaration
  910. //
  911. #line 1336 "java.g"
  912. //
  913. // Note that the list is circular so as to preserve the order of the elements
  914. //
  915. void Parser::Act70(void)
  916. {
  917.     AstListNode *tail = (AstListNode *) Sym(1);
  918.  
  919.     AstListNode *p = AllocateListNode();
  920.     p -> element = Sym(2);
  921.     p -> index = tail -> index + 1;
  922.  
  923.     p -> next = tail -> next;
  924.     tail -> next = p;
  925.  
  926.     Sym(1) = p;
  927. }
  928.  
  929. //
  930. // Rule 71:  ClassBodyDeclaration -> ClassMemberDeclaration
  931. //
  932. // void NoAction(void);
  933. //
  934.  
  935. //
  936. // Rule 72:  ClassBodyDeclaration -> StaticInitializer
  937. //
  938. // void NoAction(void);
  939. //
  940.  
  941. //
  942. // Rule 73:  ClassBodyDeclaration -> ConstructorDeclaration
  943. //
  944. // void NoAction(void);
  945. //
  946.  
  947. // 
  948. // Rule 74:  ClassBodyDeclaration ::= MethodHeaderMarker Block
  949. //
  950. #line 1370 "java.g"
  951. void Parser::Act74(void)
  952. {
  953.     Sym(1) = Sym(2);
  954. }
  955.  
  956. //
  957. // Rule 75:  ClassMemberDeclaration -> FieldDeclaration
  958. //
  959. // void NoAction(void);
  960. //
  961.  
  962. //
  963. // Rule 76:  ClassMemberDeclaration -> MethodDeclaration
  964. //
  965. // void NoAction(void);
  966. //
  967.  
  968. //
  969. // Rule 77:  ClassMemberDeclaration -> ClassDeclaration
  970. //
  971. // void NoAction(void);
  972. //
  973.  
  974. //
  975. // Rule 78:  ClassMemberDeclaration -> InterfaceDeclaration
  976. //
  977. // void NoAction(void);
  978. //
  979.  
  980. // 
  981. // Rule 79:  ClassMemberDeclaration ::= SEMICOLON
  982. //
  983. #line 1404 "java.g"
  984. void Parser::Act79(void)
  985. {
  986.     Sym(1) = ast_pool -> NewEmptyDeclaration(Token(1));
  987. }
  988.  
  989. // 
  990. // Rule 80:  FieldDeclaration ::= Modifiersopt Type VariableDeclarators SEMICOLON
  991. //
  992. #line 1423 "java.g"
  993. void Parser::Act80(void)
  994. {
  995.     AstFieldDeclaration *p = ast_pool -> NewFieldDeclaration();
  996.     if (Sym(1) != NULL)
  997.     {   
  998.         AstListNode *tail = (AstListNode *) Sym(1);
  999.         p -> AllocateVariableModifiers(tail -> index + 1);
  1000.         AstListNode *root = tail;
  1001.         do
  1002.         {
  1003.             root = root -> next;
  1004.             p -> AddVariableModifier((AstModifier *) root -> element);
  1005.         } while(root != tail);
  1006.         FreeCircularList(tail);
  1007.     }
  1008.     p -> type = Sym(2);
  1009.     //
  1010.     // The list of declarators is guaranteed not empty
  1011.     //
  1012.     {   
  1013.         AstListNode *tail = (AstListNode *) Sym(3);
  1014.         p -> AllocateVariableDeclarators(tail -> index + 1);
  1015.         AstListNode *root = tail;
  1016.         do
  1017.         {
  1018.             root = root -> next;
  1019.             p -> AddVariableDeclarator((AstVariableDeclarator *) root -> element);
  1020.         } while(root != tail);
  1021.         FreeCircularList(tail);
  1022.     }
  1023.     p -> semicolon_token      = Token(4);
  1024.     Sym(1) = p;
  1025. }
  1026.  
  1027. // 
  1028. // Rule 81:  VariableDeclarators ::= VariableDeclarator
  1029. //
  1030. #line 1461 "java.g"
  1031. //
  1032. // Note that the list is circular so as to preserve the order of the elements
  1033. //
  1034. void Parser::Act81(void)
  1035. {
  1036.     AstListNode *p = AllocateListNode();
  1037.     p -> next = p;
  1038.     p -> element = Sym(1);
  1039.     p -> index = 0;
  1040.  
  1041.     Sym(1) = p;
  1042. }
  1043.  
  1044. // 
  1045. // Rule 82:  VariableDeclarators ::= VariableDeclarators COMMA VariableDeclarator
  1046. //
  1047. #line 1478 "java.g"
  1048. //
  1049. // Note that the list is circular so as to preserve the order of the elements
  1050. //
  1051. void Parser::Act82(void)
  1052. {
  1053.     AstListNode *tail = (AstListNode *) Sym(1);
  1054.  
  1055.     AstListNode *p = AllocateListNode();
  1056.     p -> element = Sym(3);
  1057.     p -> index = tail -> index + 1;
  1058.  
  1059.     p -> next = tail -> next;
  1060.     tail -> next = p;
  1061.  
  1062.     Sym(1) = p;
  1063. }
  1064.  
  1065. // 
  1066. // Rule 83:  VariableDeclarator ::= VariableDeclaratorId
  1067. //
  1068. #line 1499 "java.g"
  1069. void Parser::Act83(void)
  1070. {
  1071.     AstVariableDeclarator *p = ast_pool -> NewVariableDeclarator();
  1072.     p -> variable_declarator_name = (AstVariableDeclaratorId *) Sym(1);
  1073.     p -> variable_initializer_opt = NULL;
  1074.     Sym(1) = p;
  1075. }
  1076.  
  1077. // 
  1078. // Rule 84:  VariableDeclarator ::= VariableDeclaratorId EQUAL VariableInitializer
  1079. //
  1080. #line 1511 "java.g"
  1081. void Parser::Act84(void)
  1082. {
  1083.     AstVariableDeclarator *p = ast_pool -> NewVariableDeclarator();
  1084.     p -> variable_declarator_name = (AstVariableDeclaratorId *) Sym(1);
  1085.     p -> variable_initializer_opt = Sym(3);
  1086.     Sym(1) = p;
  1087. }
  1088.  
  1089. // 
  1090. // Rule 85:  VariableDeclaratorId ::= Identifier Dimsopt
  1091. //
  1092. #line 1523 "java.g"
  1093. void Parser::Act85(void)
  1094. {
  1095.     AstVariableDeclaratorId *p = ast_pool -> NewVariableDeclaratorId();
  1096.     p -> identifier_token = Token(1);
  1097.     if (Sym(2) != NULL)
  1098.     {
  1099.         AstListNode *tail = (AstListNode *) Sym(2);
  1100.         p -> AllocateBrackets(tail -> index + 1);
  1101.         AstListNode *root = tail;
  1102.         do
  1103.         {
  1104.             root = root -> next;
  1105.             p -> AddBrackets((AstBrackets *) root -> element);
  1106.         } while(root != tail);
  1107.         FreeCircularList(tail);
  1108.     }
  1109.     Sym(1) = p;
  1110. }
  1111.  
  1112. //
  1113. // Rule 86:  VariableInitializer -> Expression
  1114. //
  1115. // void NoAction(void);
  1116. //
  1117.  
  1118. //
  1119. // Rule 87:  VariableInitializer -> ArrayInitializer
  1120. //
  1121. // void NoAction(void);
  1122. //
  1123.  
  1124. // 
  1125. // Rule 88:  MethodDeclaration ::= MethodHeader MethodHeaderMarker MethodBody
  1126. //
  1127. #line 1571 "java.g"
  1128. void Parser::Act88(void)
  1129. {
  1130.     ((AstMethodDeclaration *) Sym(1)) -> method_body = (AstStatement *) Sym(3);
  1131. }
  1132.  
  1133. // 
  1134. // Rule 89:  MethodHeader ::= Modifiersopt Type MethodDeclarator Throwsopt
  1135. //
  1136. #line 1580 "java.g"
  1137. void Parser::Act89(void)
  1138. {
  1139.     AstMethodDeclaration *p = ast_pool -> NewMethodDeclaration();
  1140.     if (Sym(1) != NULL)
  1141.     {   
  1142.         AstListNode *tail = (AstListNode *) Sym(1);
  1143.         p -> AllocateMethodModifiers(tail -> index + 1);
  1144.         AstListNode *root = tail;
  1145.         do
  1146.         {
  1147.             root = root -> next;
  1148.             p -> AddMethodModifier((AstModifier *) root -> element);
  1149.         } while(root != tail);
  1150.         FreeCircularList(tail);
  1151.     }
  1152.     p -> type              = Sym(2);
  1153.     p -> method_declarator = (AstMethodDeclarator *) Sym(3);
  1154.     if (Sym(4) != NULL)
  1155.     {   
  1156.         AstListNode *tail = (AstListNode *) Sym(4);
  1157.         p -> AllocateThrows(tail -> index + 1);
  1158.         AstListNode *root = tail;
  1159.         do
  1160.         {
  1161.             root = root -> next;
  1162.             p -> AddThrow((AstExpression *) root -> element);
  1163.         } while(root != tail);
  1164.         FreeCircularList(tail);
  1165.     }
  1166.     Sym(1) = p;
  1167. }
  1168.  
  1169. // 
  1170. // Rule 90:  MethodHeader ::= Modifiersopt void MethodDeclarator Throwsopt
  1171. //
  1172. #line 1616 "java.g"
  1173. void Parser::Act90(void)
  1174. {
  1175.     AstMethodDeclaration *p = ast_pool -> NewMethodDeclaration();
  1176.     if (Sym(1) != NULL)
  1177.     {   
  1178.         AstListNode *tail = (AstListNode *) Sym(1);
  1179.         p -> AllocateMethodModifiers(tail -> index + 1);
  1180.         AstListNode *root = tail;
  1181.         do
  1182.         {
  1183.             root = root -> next;
  1184.             p -> AddMethodModifier((AstModifier *) root -> element);
  1185.         } while(root != tail);
  1186.         FreeCircularList(tail);
  1187.     }
  1188.     p -> type              = ast_pool -> NewPrimitiveType(Ast::VOID_TYPE, Token(2));
  1189.     p -> method_declarator = (AstMethodDeclarator *) Sym(3);
  1190.     if (Sym(4) != NULL)
  1191.     {   
  1192.         AstListNode *tail = (AstListNode *) Sym(4);
  1193.         p -> AllocateThrows(tail -> index + 1);
  1194.         AstListNode *root = tail;
  1195.         do
  1196.         {
  1197.             root = root -> next;
  1198.             p -> AddThrow((AstExpression *) root -> element);
  1199.         } while(root != tail);
  1200.         FreeCircularList(tail);
  1201.     }
  1202.     Sym(1) = p;
  1203. }
  1204.  
  1205. // 
  1206. // Rule 91:  MethodDeclarator ::= Identifier LPAREN FormalParameterListopt RPAREN Dimsopt
  1207. //
  1208. #line 1652 "java.g"
  1209. void Parser::Act91(void)
  1210. {
  1211.     AstMethodDeclarator *p = ast_pool -> NewMethodDeclarator();
  1212.     p -> identifier_token        = Token(1);
  1213.     p -> left_parenthesis_token  = Token(2);
  1214.     if (Sym(3) != NULL)
  1215.     {   
  1216.         AstListNode *tail = (AstListNode *) Sym(3);
  1217.         p -> AllocateFormalParameters(tail -> index + 1);
  1218.         AstListNode *root = tail;
  1219.         do
  1220.         {
  1221.             root = root -> next;
  1222.             p -> AddFormalParameter((AstFormalParameter *) root -> element);
  1223.         } while(root != tail);
  1224.         FreeCircularList(tail);
  1225.     }
  1226.     p -> right_parenthesis_token = Token(4);
  1227.     if (Sym(5) != NULL)
  1228.     {
  1229.         AstListNode *tail = (AstListNode *) Sym(5);
  1230.         p -> AllocateBrackets(tail -> index + 1);
  1231.         AstListNode *root = tail;
  1232.         do
  1233.         {
  1234.             root = root -> next;
  1235.             p -> AddBrackets((AstBrackets *) root -> element);
  1236.         } while(root != tail);
  1237.         FreeCircularList(tail);
  1238.     }
  1239.     Sym(1) = p;
  1240. }
  1241.  
  1242. // 
  1243. // Rule 92:  FormalParameterList ::= FormalParameter
  1244. //
  1245. #line 1689 "java.g"
  1246. //
  1247. // Note that the list is circular so as to preserve the order of the elements
  1248. //
  1249. void Parser::Act92(void)
  1250. {
  1251.     AstListNode *p = AllocateListNode();
  1252.     p -> next = p;
  1253.     p -> element = Sym(1);
  1254.     p -> index = 0;
  1255.  
  1256.     Sym(1) = p;
  1257. }
  1258.  
  1259. // 
  1260. // Rule 93:  FormalParameterList ::= FormalParameterList COMMA FormalParameter
  1261. //
  1262. #line 1706 "java.g"
  1263. //
  1264. // Note that the list is circular so as to preserve the order of the elements
  1265. //
  1266. void Parser::Act93(void)
  1267. {
  1268.     AstListNode *tail = (AstListNode *) Sym(1);
  1269.  
  1270.     AstListNode *p = AllocateListNode();
  1271.     p -> element = Sym(3);
  1272.     p -> index = tail -> index + 1;
  1273.  
  1274.     p -> next = tail -> next;
  1275.     tail -> next = p;
  1276.  
  1277.     Sym(1) = p;
  1278. }
  1279.  
  1280. // 
  1281. // Rule 94:  FormalParameter ::= Type VariableDeclaratorId
  1282. //
  1283. #line 1727 "java.g"
  1284. void Parser::Act94(void)
  1285. {
  1286.     AstFormalParameter *p = ast_pool -> NewFormalParameter();
  1287.     p -> type                     = Sym(1);
  1288.     p -> variable_declarator_name = (AstVariableDeclaratorId *) Sym(2);
  1289.     Sym(1) = p;
  1290. }
  1291.  
  1292. // 
  1293. // Rule 95:  FormalParameter ::= Modifiers Type VariableDeclaratorId
  1294. //
  1295. #line 1740 "java.g"
  1296. void Parser::Act95(void)
  1297. {
  1298.     AstFormalParameter *p = ast_pool -> NewFormalParameter();
  1299.     //
  1300.     // The list of modifiers is guaranteed not empty
  1301.     //
  1302.     {   
  1303.         AstListNode *tail = (AstListNode *) Sym(1);
  1304.         p -> AllocateParameterModifiers(tail -> index + 1);
  1305.         AstListNode *root = tail;
  1306.         do
  1307.         {
  1308.             root = root -> next;
  1309.             p -> AddParameterModifier((AstModifier *) root -> element);
  1310.         } while(root != tail);
  1311.         FreeCircularList(tail);
  1312.     }
  1313.     p -> type                     = Sym(2);
  1314.     p -> variable_declarator_name = (AstVariableDeclaratorId *) Sym(3);
  1315.     Sym(1) = p;
  1316. }
  1317.  
  1318. //
  1319. // Rule 96:  Throws ::= throws ClassTypeList
  1320. //
  1321. // void SetSym1ToSym2(void);
  1322. //
  1323.  
  1324. // 
  1325. // Rule 97:  ClassTypeList ::= ClassType
  1326. //
  1327. #line 1773 "java.g"
  1328. //
  1329. // Note that the list is circular so as to preserve the order of the elements
  1330. //
  1331. void Parser::Act97(void)
  1332. {
  1333.     AstListNode *p = AllocateListNode();
  1334.     p -> next = p;
  1335.     p -> element = Sym(1);
  1336.     p -> index = 0;
  1337.  
  1338.     Sym(1) = p;
  1339. }
  1340.  
  1341. // 
  1342. // Rule 98:  ClassTypeList ::= ClassTypeList COMMA ClassType
  1343. //
  1344. #line 1790 "java.g"
  1345. //
  1346. // Note that the list is circular so as to preserve the order of the elements
  1347. //
  1348. void Parser::Act98(void)
  1349. {
  1350.     AstListNode *tail = (AstListNode *) Sym(1);
  1351.  
  1352.     AstListNode *p = AllocateListNode();
  1353.     p -> element = Sym(3);
  1354.     p -> index = tail -> index + 1;
  1355.  
  1356.     p -> next = tail -> next;
  1357.     tail -> next = p;
  1358.  
  1359.     Sym(1) = p;
  1360. }
  1361.  
  1362. //
  1363. // Rule 99:  MethodBody -> Block
  1364. //
  1365. // void NoAction(void);
  1366. //
  1367.  
  1368. // 
  1369. // Rule 100:  MethodBody ::= SEMICOLON
  1370. //
  1371. #line 1815 "java.g"
  1372. void Parser::MakeEmptyStatement(void)
  1373. {
  1374.     Sym(1) = ast_pool -> NewEmptyStatement(Token(1));
  1375. }
  1376.  
  1377. // 
  1378. // Rule 101:  StaticInitializer ::= static MethodHeaderMarker Block
  1379. //
  1380. #line 1826 "java.g"
  1381. void Parser::Act101(void)
  1382. {
  1383.     AstStaticInitializer *p = ast_pool -> NewStaticInitializer();
  1384.     p -> static_token = Token(1);
  1385.     p -> block        = (AstBlock *) Sym(3);
  1386.     Sym(1) = p;
  1387. }
  1388.  
  1389. // 
  1390. // Rule 102:  ConstructorDeclaration ::= Modifiersopt ConstructorDeclarator Throwsopt MethodHeaderMarker ConstructorBody
  1391. //
  1392. #line 1851 "java.g"
  1393. void Parser::Act102(void)
  1394. {
  1395.     AstConstructorBlock *block = Sym(5) -> ConstructorBlockCast();
  1396.     if (! block)
  1397.     {
  1398.         block = ast_pool -> NewConstructorBlock();
  1399.         block -> left_brace_token                    = Sym(5) -> LeftToken();
  1400.         block -> explicit_constructor_invocation_opt = NULL;
  1401.         block -> block                               = (AstBlock *) Sym(5);
  1402.         block -> right_brace_token                   = Sym(5) -> RightToken();
  1403.     }
  1404.  
  1405.     AstConstructorDeclaration *p = ast_pool -> NewConstructorDeclaration();
  1406.  
  1407.     if (Sym(1) != NULL)
  1408.     {   
  1409.         AstListNode *tail = (AstListNode *) Sym(1);
  1410.         p -> AllocateConstructorModifiers(tail -> index + 1);
  1411.         AstListNode *root = tail;
  1412.         do
  1413.         {
  1414.             root = root -> next;
  1415.             p -> AddConstructorModifier((AstModifier *) root -> element);
  1416.         } while(root != tail);
  1417.         FreeCircularList(tail);
  1418.     }
  1419.     p -> constructor_declarator = (AstMethodDeclarator *) Sym(2);
  1420.     if (Sym(3) != NULL)
  1421.     {   
  1422.         AstListNode *tail = (AstListNode *) Sym(3);
  1423.         p -> AllocateThrows(tail -> index + 1);
  1424.         AstListNode *root = tail;
  1425.         do
  1426.         {
  1427.             root = root -> next;
  1428.             p -> AddThrow((AstExpression *) root -> element);
  1429.         } while(root != tail);
  1430.         FreeCircularList(tail);
  1431.     }
  1432.     p -> constructor_body       = block;
  1433.  
  1434.     Sym(1) = p;
  1435. }
  1436.  
  1437. // 
  1438. // Rule 103:  ConstructorDeclarator ::= Identifier LPAREN FormalParameterListopt RPAREN
  1439. //
  1440. #line 1907 "java.g"
  1441. void Parser::Act103(void)
  1442. {
  1443.     AstMethodDeclarator *p = ast_pool -> NewMethodDeclarator();
  1444.     p -> identifier_token        = Token(1);
  1445.     p -> left_parenthesis_token  = Token(2);
  1446.     if (Sym(3) != NULL)
  1447.     {   
  1448.         AstListNode *tail = (AstListNode *) Sym(3);
  1449.         p -> AllocateFormalParameters(tail -> index + 1);
  1450.         AstListNode *root = tail;
  1451.         do
  1452.         {
  1453.             root = root -> next;
  1454.             p -> AddFormalParameter((AstFormalParameter *) root -> element);
  1455.         } while(root != tail);
  1456.         FreeCircularList(tail);
  1457.     }
  1458.     p -> right_parenthesis_token = Token(4);
  1459.     Sym(1) = p;
  1460. }
  1461.  
  1462. //
  1463. // Rule 104:  ConstructorBody -> Block
  1464. //
  1465. // void NoAction(void);
  1466. //
  1467.  
  1468. // 
  1469. // Rule 105:  ConstructorBody ::= LBRACE ExplicitConstructorInvocation BlockStatementsopt RBRACE
  1470. //
  1471. #line 1942 "java.g"
  1472. void Parser::Act105(void)
  1473. {
  1474.     AstBlock *block = ast_pool -> NewBlock();
  1475.     if (Sym(3) != NULL)
  1476.     {
  1477.         AstListNode *tail = (AstListNode *) Sym(3);
  1478.         block -> AllocateBlockStatements(tail -> index + 1);
  1479.         AstListNode *root = tail;
  1480.         block -> left_brace_token  = root -> element -> LeftToken();
  1481.         block -> right_brace_token = tail -> element -> RightToken();
  1482.         do
  1483.         {
  1484.             root = root -> next;
  1485.             block -> AddStatement((AstStatement *) root -> element);
  1486.         } while(root != tail);
  1487.         FreeCircularList(tail);
  1488.     }
  1489.     else
  1490.     {
  1491.         block -> left_brace_token  = Token(4);
  1492.         block -> right_brace_token = Token(4);
  1493.     }
  1494.  
  1495.     AstConstructorBlock *p = ast_pool -> NewConstructorBlock();
  1496.     p -> left_brace_token                    = Token(1);
  1497.     p -> explicit_constructor_invocation_opt = Sym(2);
  1498.     p -> block                               = block;
  1499.     p -> right_brace_token                   = Token(4);
  1500.     Sym(1) = p;
  1501. }
  1502.  
  1503. // 
  1504. // Rule 106:  ExplicitConstructorInvocation ::= this LPAREN ArgumentListopt RPAREN SEMICOLON
  1505. //
  1506. #line 1977 "java.g"
  1507. void Parser::Act106(void)
  1508. {
  1509.     AstThisCall *p = ast_pool -> NewThisCall();
  1510.     p -> base_opt                = NULL;
  1511.     p -> dot_token_opt           = 0;
  1512.     p -> this_token              = Token(1);
  1513.     p -> left_parenthesis_token  = Token(2);
  1514.     if (Sym(3) != NULL)
  1515.     {
  1516.         AstListNode *tail = (AstListNode *) Sym(3);
  1517.         p -> AllocateArguments(tail -> index + 1);
  1518.         AstListNode *root = tail;
  1519.         do
  1520.         {
  1521.             root = root -> next;
  1522.             p -> AddArgument((AstExpression *) root -> element);
  1523.         } while(root != tail);
  1524.         FreeCircularList(tail);
  1525.     }
  1526.     p -> right_parenthesis_token = Token(4);
  1527.     p -> semicolon_token         = Token(5);
  1528.     Sym(1) = p;
  1529. }
  1530.  
  1531. // 
  1532. // Rule 107:  ExplicitConstructorInvocation ::= super LPAREN ArgumentListopt RPAREN SEMICOLON
  1533. //
  1534. #line 2005 "java.g"
  1535. void Parser::Act107(void)
  1536. {
  1537.     AstSuperCall *p = ast_pool -> NewSuperCall();
  1538.     p -> base_opt                = NULL;
  1539.     p -> dot_token_opt           = 0;
  1540.     p -> super_token             = Token(1);
  1541.     p -> left_parenthesis_token  = Token(2);
  1542.     if (Sym(3) != NULL)
  1543.     {
  1544.         AstListNode *tail = (AstListNode *) Sym(3);
  1545.         p -> AllocateArguments(tail -> index + 1);
  1546.         AstListNode *root = tail;
  1547.         do
  1548.         {
  1549.             root = root -> next;
  1550.             p -> AddArgument((AstExpression *) root -> element);
  1551.         } while(root != tail);
  1552.         FreeCircularList(tail);
  1553.     }
  1554.     p -> right_parenthesis_token = Token(4);
  1555.     p -> semicolon_token         = Token(5);
  1556.     Sym(1) = p;
  1557. }
  1558.  
  1559. // 
  1560. // Rule 108:  ExplicitConstructorInvocation ::= Primary DOT this LPAREN ArgumentListopt RPAREN SEMICOLON
  1561. //
  1562. #line 2034 "java.g"
  1563. void Parser::Act108(void)
  1564. {
  1565.     AstThisCall *p = ast_pool -> NewThisCall();
  1566.     p -> base_opt               = (AstExpression *) Sym(1);
  1567.     p -> dot_token_opt          = Token(2);
  1568.     p -> this_token             = Token(3);
  1569.     p -> left_parenthesis_token = Token(4);
  1570.     if (Sym(5) != NULL)
  1571.     {
  1572.         AstListNode *tail = (AstListNode *) Sym(5);
  1573.         p -> AllocateArguments(tail -> index + 1);
  1574.         AstListNode *root = tail;
  1575.         do
  1576.         {
  1577.             root = root -> next;
  1578.             p -> AddArgument((AstExpression *) root -> element);
  1579.         } while(root != tail);
  1580.         FreeCircularList(tail);
  1581.     }
  1582.     p -> right_parenthesis_token = Token(6);
  1583.     p -> semicolon_token         = Token(7);
  1584.     Sym(1) = p;
  1585. }
  1586.  
  1587. // 
  1588. // Rule 109:  ExplicitConstructorInvocation ::= Primary DOT super LPAREN ArgumentListopt RPAREN SEMICOLON
  1589. //
  1590. #line 2063 "java.g"
  1591. void Parser::MakeQualifiedSuper(void)
  1592. {
  1593.     AstSuperCall *p = ast_pool -> NewSuperCall();
  1594.     p -> base_opt                = (AstExpression *) Sym(1);
  1595.     p -> dot_token_opt           = Token(2);
  1596.     p -> super_token             = Token(3);
  1597.     p -> left_parenthesis_token  = Token(4);
  1598.     if (Sym(5) != NULL)
  1599.     {
  1600.         AstListNode *tail = (AstListNode *) Sym(5);
  1601.         p -> AllocateArguments(tail -> index + 1);
  1602.         AstListNode *root = tail;
  1603.         do
  1604.         {
  1605.             root = root -> next;
  1606.             p -> AddArgument((AstExpression *) root -> element);
  1607.         } while(root != tail);
  1608.         FreeCircularList(tail);
  1609.     }
  1610.     p -> right_parenthesis_token = Token(6);
  1611.     p -> semicolon_token         = Token(7);
  1612.     Sym(1) = p;
  1613. }
  1614.  
  1615. //
  1616. // Rule 110:  ExplicitConstructorInvocation ::= Name DOT super LPAREN ArgumentListopt RPAREN SEMICOLON
  1617. //
  1618. // void MakeQualifiedSuper(void);
  1619. //
  1620.  
  1621. // 
  1622. // Rule 111:  InterfaceDeclaration ::= Modifiersopt interface Identifier ExtendsInterfacesopt InterfaceBody
  1623. //
  1624. #line 2106 "java.g"
  1625. void Parser::Act111(void)
  1626. {
  1627.     AstInterfaceDeclaration *p = (AstInterfaceDeclaration *) Sym(5);
  1628.     if (Sym(1) != NULL)
  1629.     {   
  1630.         AstListNode *tail = (AstListNode *) Sym(1);
  1631.         p -> AllocateInterfaceModifiers(tail -> index + 1);
  1632.         AstListNode *root = tail;
  1633.         do
  1634.         {
  1635.             root = root -> next;
  1636.             p -> AddInterfaceModifier((AstModifier *) root -> element);
  1637.         } while(root != tail);
  1638.         FreeCircularList(tail);
  1639.     }
  1640.     p -> interface_token  = Token(2);
  1641.     p -> identifier_token = Token(3);
  1642.     if (Sym(4) != NULL)
  1643.     {
  1644.         AstListNode *tail = (AstListNode *) Sym(4);
  1645.         p -> AllocateExtendsInterfaces(tail -> index + 1);
  1646.         AstListNode *root = tail;
  1647.         do
  1648.         {
  1649.             root = root -> next;
  1650.             p -> AddExtendsInterface((AstExpression *) root -> element);
  1651.         } while(root != tail);
  1652.         FreeCircularList(tail);
  1653.     }
  1654.     Sym(1) = p;
  1655. }
  1656.  
  1657. //
  1658. // Rule 112:  ExtendsInterfaces ::= extends InterfaceTypeList
  1659. //
  1660. // void SetSym1ToSym2(void);
  1661. //
  1662.  
  1663. // 
  1664. // Rule 113:  InterfaceBody ::= LBRACE InterfaceMemberDeclarationsopt RBRACE
  1665. //
  1666. #line 2149 "java.g"
  1667. void Parser::Act113(void)
  1668. {
  1669.     AstInterfaceDeclaration *p = ast_pool -> NewInterfaceDeclaration();
  1670.     if (parse_header_only)
  1671.         p -> mark_unparsed();
  1672.  
  1673.     p -> left_brace_token = Token(1);
  1674.     if (Sym(2) != NULL)
  1675.     {   
  1676.         int num_class_variables = 0,
  1677.             num_methods = 0,
  1678.             num_inner_classes = 0,
  1679.             num_inner_interfaces = 0,
  1680.             num_empty_declarations = 0;
  1681.  
  1682.         AstListNode *tail = (AstListNode *) Sym(2);
  1683.         p -> AllocateInterfaceMemberDeclarations(tail -> index + 1);
  1684.         AstListNode *root = tail;
  1685.         do
  1686.         {
  1687.             root = root -> next;
  1688.             p -> AddInterfaceMemberDeclaration(root -> element);
  1689.  
  1690.             AstFieldDeclaration *field_declaration = root -> element -> FieldDeclarationCast();
  1691.             if (field_declaration)
  1692.             {
  1693.                 field_declaration -> MarkStatic();
  1694.                 num_class_variables++;
  1695.             }
  1696.             else if (root -> element -> MethodDeclarationCast())
  1697.             {
  1698.                 num_methods++;
  1699.             }
  1700.             else if (root -> element -> ClassDeclarationCast())
  1701.             {
  1702.                 num_inner_classes++;
  1703.             }
  1704.             else if (root -> element -> InterfaceDeclarationCast())
  1705.             {
  1706.                 num_inner_interfaces++;
  1707.             }
  1708.             else num_empty_declarations++;
  1709.         } while(root != tail);
  1710.  
  1711.         p -> AllocateClassVariables(num_class_variables);
  1712.         p -> AllocateMethods(num_methods);
  1713.         p -> AllocateNestedClasses(num_inner_classes);
  1714.         p -> AllocateNestedInterfaces(num_inner_interfaces);
  1715.         p -> AllocateEmptyDeclarations(num_empty_declarations);
  1716.  
  1717.         root = tail;
  1718.         do
  1719.         {
  1720.             root = root -> next;
  1721.  
  1722.             AstFieldDeclaration *field_declaration;
  1723.             AstMethodDeclaration *method_declaration;
  1724.             AstClassDeclaration *class_declaration;
  1725.             AstInterfaceDeclaration *interface_declaration;
  1726.  
  1727.             if (field_declaration = root -> element -> FieldDeclarationCast())
  1728.             {
  1729.                 p -> AddClassVariable(field_declaration);
  1730.             }
  1731.             else if (method_declaration = root -> element -> MethodDeclarationCast())
  1732.             {
  1733.                 p -> AddMethod(method_declaration);
  1734.             }
  1735.             else if (class_declaration = root -> element -> ClassDeclarationCast())
  1736.             {
  1737.                 p -> AddNestedClass(class_declaration);
  1738.             }
  1739.             else if (interface_declaration = root -> element -> InterfaceDeclarationCast())
  1740.             {
  1741.                 p -> AddNestedInterface(interface_declaration);
  1742.             }
  1743.             else // assert(interface_declaration = root -> element -> EmptyDeclarationCast())
  1744.             {
  1745.                 p -> AddEmptyDeclaration((AstEmptyDeclaration *) root -> element);
  1746.             }
  1747.         } while(root != tail);
  1748.         FreeCircularList(tail);
  1749.     }
  1750.     p -> right_brace_token = Token(3);
  1751.     p -> pool = body_pool; // from now on, this is the storage pool to use for this type
  1752.     Sym(1) = p;
  1753. }
  1754.  
  1755. // 
  1756. // Rule 114:  InterfaceMemberDeclarations ::= InterfaceMemberDeclaration
  1757. //
  1758. #line 2241 "java.g"
  1759. //
  1760. // Note that the list is circular so as to preserve the order of the elements
  1761. //
  1762. void Parser::Act114(void)
  1763. {
  1764.     AstListNode *p = AllocateListNode();
  1765.     p -> next = p;
  1766.     p -> element = Sym(1);
  1767.     p -> index = 0;
  1768.  
  1769.     Sym(1) = p;
  1770. }
  1771.  
  1772. // 
  1773. // Rule 115:  InterfaceMemberDeclarations ::= InterfaceMemberDeclarations InterfaceMemberDeclaration
  1774. //
  1775. #line 2258 "java.g"
  1776. //
  1777. // Note that the list is circular so as to preserve the order of the elements
  1778. //
  1779. void Parser::Act115(void)
  1780. {
  1781.     AstListNode *tail = (AstListNode *) Sym(1);
  1782.  
  1783.     AstListNode *p = AllocateListNode();
  1784.     p -> element = Sym(2);
  1785.     p -> index = tail -> index + 1;
  1786.  
  1787.     p -> next = tail -> next;
  1788.     tail -> next = p;
  1789.  
  1790.     Sym(1) = p;
  1791. }
  1792.  
  1793. //
  1794. // Rule 116:  InterfaceMemberDeclaration -> ConstantDeclaration
  1795. //
  1796. // void NoAction(void);
  1797. //
  1798.  
  1799. //
  1800. // Rule 117:  InterfaceMemberDeclaration -> AbstractMethodDeclaration
  1801. //
  1802. // void NoAction(void);
  1803. //
  1804.  
  1805. //
  1806. // Rule 118:  InterfaceMemberDeclaration -> ClassDeclaration
  1807. //
  1808. // void NoAction(void);
  1809. //
  1810.  
  1811. //
  1812. // Rule 119:  InterfaceMemberDeclaration -> InterfaceDeclaration
  1813. //
  1814. // void NoAction(void);
  1815. //
  1816.  
  1817. // 
  1818. // Rule 120:  InterfaceMemberDeclaration ::= SEMICOLON
  1819. //
  1820. #line 2304 "java.g"
  1821. void Parser::Act120(void)
  1822. {
  1823.     Sym(1) = ast_pool -> NewEmptyDeclaration(Token(1));
  1824. }
  1825.  
  1826. //
  1827. // Rule 121:  ConstantDeclaration -> FieldDeclaration
  1828. //
  1829. // void NoAction(void);
  1830. //
  1831.  
  1832. // 
  1833. // Rule 122:  AbstractMethodDeclaration ::= MethodHeader SEMICOLON
  1834. //
  1835. #line 2317 "java.g"
  1836. void Parser::Act122(void)
  1837. {
  1838.     ((AstMethodDeclaration *) Sym(1)) -> method_body = ast_pool -> NewEmptyStatement(Token(2));
  1839. }
  1840.  
  1841. // 
  1842. // Rule 123:  ArrayInitializer ::= LBRACE ,opt RBRACE
  1843. //
  1844. #line 2334 "java.g"
  1845. void Parser::Act123(void)
  1846. {
  1847.     AstArrayInitializer *p = ast_pool -> NewArrayInitializer();
  1848.     p -> left_brace_token      = Token(1);
  1849.     p -> right_brace_token     = Token(3);
  1850.     Sym(1) = p;
  1851. }
  1852.  
  1853. // 
  1854. // Rule 124:  ArrayInitializer ::= LBRACE VariableInitializers RBRACE
  1855. //
  1856. #line 2346 "java.g"
  1857. void Parser::Act124(void)
  1858. {
  1859.     AstArrayInitializer *p = ast_pool -> NewArrayInitializer();
  1860.     p -> left_brace_token      = Token(1);
  1861.     if (Sym(2) != NULL)
  1862.     {
  1863.         AstListNode *tail = (AstListNode *) Sym(2);
  1864.         p -> AllocateVariableInitializers(tail -> index + 1);
  1865.         AstListNode *root = tail;
  1866.         do
  1867.         {
  1868.             root = root -> next;
  1869.             p -> AddVariableInitializer(root -> element);
  1870.         } while(root != tail);
  1871.         FreeCircularList(tail);
  1872.     }
  1873.     p -> right_brace_token     = Token(3);
  1874.     Sym(1) = p;
  1875. }
  1876.  
  1877. // 
  1878. // Rule 125:  ArrayInitializer ::= LBRACE VariableInitializers COMMA RBRACE
  1879. //
  1880. #line 2370 "java.g"
  1881. void Parser::Act125(void)
  1882. {
  1883.     AstArrayInitializer *p = ast_pool -> NewArrayInitializer();
  1884.     p -> left_brace_token      = Token(1);
  1885.     if (Sym(2) != NULL)
  1886.     {
  1887.         AstListNode *tail = (AstListNode *) Sym(2);
  1888.         p -> AllocateVariableInitializers(tail -> index + 1);
  1889.         AstListNode *root = tail;
  1890.         do
  1891.         {
  1892.             root = root -> next;
  1893.             p -> AddVariableInitializer(root -> element);
  1894.         } while(root != tail);
  1895.         FreeCircularList(tail);
  1896.     }
  1897.     p -> right_brace_token     = Token(4);
  1898.     Sym(1) = p;
  1899. }
  1900.  
  1901. // 
  1902. // Rule 126:  VariableInitializers ::= VariableInitializer
  1903. //
  1904. #line 2394 "java.g"
  1905. //
  1906. // Note that the list is circular so as to preserve the order of the elements
  1907. //
  1908. void Parser::Act126(void)
  1909. {
  1910.     AstListNode *p = AllocateListNode();
  1911.     p -> next = p;
  1912.     p -> element = Sym(1);
  1913.     p -> index = 0;
  1914.  
  1915.     Sym(1) = p;
  1916. }
  1917.  
  1918. // 
  1919. // Rule 127:  VariableInitializers ::= VariableInitializers COMMA VariableInitializer
  1920. //
  1921. #line 2411 "java.g"
  1922. //
  1923. // Note that the list is circular so as to preserve the order of the elements
  1924. //
  1925. void Parser::Act127(void)
  1926. {
  1927.     AstListNode *tail = (AstListNode *) Sym(1);
  1928.  
  1929.     AstListNode *p = AllocateListNode();
  1930.     p -> element = Sym(3);
  1931.     p -> index = tail -> index + 1;
  1932.  
  1933.     p -> next = tail -> next;
  1934.     tail -> next = p;
  1935.  
  1936.     Sym(1) = p;
  1937. }
  1938.  
  1939. // 
  1940. // Rule 128:  Block ::= LBRACE BlockStatementsopt RBRACE
  1941. //
  1942. #line 2434 "java.g"
  1943. void Parser::Act128(void)
  1944. {
  1945.     AstBlock *p = ast_pool -> NewBlock();
  1946.     p -> left_brace_token  = Token(1);
  1947.     if (Sym(2) != NULL)
  1948.     {
  1949.         AstListNode *tail = (AstListNode *) Sym(2);
  1950.         p -> AllocateBlockStatements(tail -> index + 1);
  1951.         AstListNode *root = tail;
  1952.         do
  1953.         {
  1954.             root = root -> next;
  1955.             p -> AddStatement((AstStatement *) root -> element);
  1956.         } while(root != tail);
  1957.         FreeCircularList(tail);
  1958.     }
  1959.     p -> right_brace_token = Token(3);
  1960.     Sym(1) = p;
  1961. }
  1962.  
  1963. // 
  1964. // Rule 129:  BlockStatements ::= BlockStatement
  1965. //
  1966. #line 2458 "java.g"
  1967. //
  1968. // Note that the list is circular so as to preserve the order of the elements
  1969. //
  1970. void Parser::Act129(void)
  1971. {
  1972.     AstListNode *p = AllocateListNode();
  1973.     p -> next = p;
  1974.     p -> element = Sym(1);
  1975.     p -> index = 0;
  1976.  
  1977.     Sym(1) = p;
  1978. }
  1979.  
  1980. // 
  1981. // Rule 130:  BlockStatements ::= BlockStatements BlockStatement
  1982. //
  1983. #line 2475 "java.g"
  1984. //
  1985. // Note that the list is circular so as to preserve the order of the elements
  1986. //
  1987. void Parser::Act130(void)
  1988. {
  1989.     AstListNode *tail = (AstListNode *) Sym(1);
  1990.  
  1991.     AstListNode *p = AllocateListNode();
  1992.     p -> element = Sym(2);
  1993.     p -> index = tail -> index + 1;
  1994.  
  1995.     p -> next = tail -> next;
  1996.     tail -> next = p;
  1997.  
  1998.     Sym(1) = p;
  1999. }
  2000.  
  2001. //
  2002. // Rule 131:  BlockStatement -> LocalVariableDeclarationStatement
  2003. //
  2004. // void NoAction(void);
  2005. //
  2006.  
  2007. //
  2008. // Rule 132:  BlockStatement -> Statement
  2009. //
  2010. // void NoAction(void);
  2011. //
  2012.  
  2013. //
  2014. // Rule 133:  BlockStatement -> ClassDeclaration
  2015. //
  2016. // void NoAction(void);
  2017. //
  2018.  
  2019. // 
  2020. // Rule 134:  LocalVariableDeclarationStatement ::= LocalVariableDeclaration SEMICOLON
  2021. //
  2022. #line 2509 "java.g"
  2023. void Parser::Act134(void)
  2024. {
  2025.     ((AstLocalVariableDeclarationStatement *) Sym(1)) -> semicolon_token_opt = Token(2);
  2026. }
  2027.  
  2028. // 
  2029. // Rule 135:  LocalVariableDeclaration ::= Type VariableDeclarators
  2030. //
  2031. #line 2518 "java.g"
  2032. void Parser::Act135(void)
  2033. {
  2034.     AstLocalVariableDeclarationStatement *p = ast_pool -> NewLocalVariableDeclarationStatement();
  2035.     p -> type                 = Sym(1);
  2036.     //
  2037.     // The list of declarators is guaranteed not empty
  2038.     //
  2039.     {   
  2040.         AstListNode *tail = (AstListNode *) Sym(2);
  2041.         p -> AllocateVariableDeclarators(tail -> index + 1);
  2042.         AstListNode *root = tail;
  2043.         do
  2044.         {
  2045.             root = root -> next;
  2046.             p -> AddVariableDeclarator((AstVariableDeclarator *) root -> element);
  2047.         } while(root != tail);
  2048.         FreeCircularList(tail);
  2049.     }
  2050.     p -> semicolon_token_opt  = 0;
  2051.     Sym(1) = p;
  2052. }
  2053.  
  2054. // 
  2055. // Rule 136:  LocalVariableDeclaration ::= Modifiers Type VariableDeclarators
  2056. //
  2057. #line 2545 "java.g"
  2058. void Parser::Act136(void)
  2059. {
  2060.     AstLocalVariableDeclarationStatement *p = ast_pool -> NewLocalVariableDeclarationStatement();
  2061.     //
  2062.     // The list of modifiers is guaranteed not empty
  2063.     //
  2064.     {   
  2065.         AstListNode *tail = (AstListNode *) Sym(1);
  2066.         p -> AllocateLocalModifiers(tail -> index + 1);
  2067.         AstListNode *root = tail;
  2068.         do
  2069.         {
  2070.             root = root -> next;
  2071.             p -> AddLocalModifier((AstModifier *) root -> element);
  2072.         } while(root != tail);
  2073.         FreeCircularList(tail);
  2074.     }
  2075.     p -> type = Sym(2);
  2076.     //
  2077.     // The list of declarators is guaranteed not empty
  2078.     //
  2079.     {   
  2080.         AstListNode *tail = (AstListNode *) Sym(3);
  2081.         p -> AllocateVariableDeclarators(tail -> index + 1);
  2082.         AstListNode *root = tail;
  2083.         do
  2084.         {
  2085.             root = root -> next;
  2086.             p -> AddVariableDeclarator((AstVariableDeclarator *) root -> element);
  2087.         } while(root != tail);
  2088.         FreeCircularList(tail);
  2089.     }
  2090.     p -> semicolon_token_opt  = 0;
  2091.     Sym(1) = p;
  2092. }
  2093.  
  2094. //
  2095. // Rule 137:  Statement -> StatementWithoutTrailingSubstatement
  2096. //
  2097. // void NoAction(void);
  2098. //
  2099.  
  2100. //
  2101. // Rule 138:  Statement -> LabeledStatement
  2102. //
  2103. // void NoAction(void);
  2104. //
  2105.  
  2106. //
  2107. // Rule 139:  Statement -> IfThenStatement
  2108. //
  2109. // void NoAction(void);
  2110. //
  2111.  
  2112. //
  2113. // Rule 140:  Statement -> IfThenElseStatement
  2114. //
  2115. // void NoAction(void);
  2116. //
  2117.  
  2118. //
  2119. // Rule 141:  Statement -> WhileStatement
  2120. //
  2121. // void NoAction(void);
  2122. //
  2123.  
  2124. //
  2125. // Rule 142:  Statement -> ForStatement
  2126. //
  2127. // void NoAction(void);
  2128. //
  2129.  
  2130. //
  2131. // Rule 143:  StatementNoShortIf -> StatementWithoutTrailingSubstatement
  2132. //
  2133. // void NoAction(void);
  2134. //
  2135.  
  2136. //
  2137. // Rule 144:  StatementNoShortIf -> LabeledStatementNoShortIf
  2138. //
  2139. // void NoAction(void);
  2140. //
  2141.  
  2142. //
  2143. // Rule 145:  StatementNoShortIf -> IfThenElseStatementNoShortIf
  2144. //
  2145. // void NoAction(void);
  2146. //
  2147.  
  2148. //
  2149. // Rule 146:  StatementNoShortIf -> WhileStatementNoShortIf
  2150. //
  2151. // void NoAction(void);
  2152. //
  2153.  
  2154. //
  2155. // Rule 147:  StatementNoShortIf -> ForStatementNoShortIf
  2156. //
  2157. // void NoAction(void);
  2158. //
  2159.  
  2160. //
  2161. // Rule 148:  StatementWithoutTrailingSubstatement -> Block
  2162. //
  2163. // void NoAction(void);
  2164. //
  2165.  
  2166. //
  2167. // Rule 149:  StatementWithoutTrailingSubstatement -> EmptyStatement
  2168. //
  2169. // void NoAction(void);
  2170. //
  2171.  
  2172. //
  2173. // Rule 150:  StatementWithoutTrailingSubstatement -> ExpressionStatement
  2174. //
  2175. // void NoAction(void);
  2176. //
  2177.  
  2178. //
  2179. // Rule 151:  StatementWithoutTrailingSubstatement -> SwitchStatement
  2180. //
  2181. // void NoAction(void);
  2182. //
  2183.  
  2184. //
  2185. // Rule 152:  StatementWithoutTrailingSubstatement -> DoStatement
  2186. //
  2187. // void NoAction(void);
  2188. //
  2189.  
  2190. //
  2191. // Rule 153:  StatementWithoutTrailingSubstatement -> BreakStatement
  2192. //
  2193. // void NoAction(void);
  2194. //
  2195.  
  2196. //
  2197. // Rule 154:  StatementWithoutTrailingSubstatement -> ContinueStatement
  2198. //
  2199. // void NoAction(void);
  2200. //
  2201.  
  2202. //
  2203. // Rule 155:  StatementWithoutTrailingSubstatement -> ReturnStatement
  2204. //
  2205. // void NoAction(void);
  2206. //
  2207.  
  2208. //
  2209. // Rule 156:  StatementWithoutTrailingSubstatement -> SynchronizedStatement
  2210. //
  2211. // void NoAction(void);
  2212. //
  2213.  
  2214. //
  2215. // Rule 157:  StatementWithoutTrailingSubstatement -> ThrowStatement
  2216. //
  2217. // void NoAction(void);
  2218. //
  2219.  
  2220. //
  2221. // Rule 158:  StatementWithoutTrailingSubstatement -> TryStatement
  2222. //
  2223. // void NoAction(void);
  2224. //
  2225.  
  2226. //
  2227. // Rule 159:  EmptyStatement ::= SEMICOLON
  2228. //
  2229. // void MakeEmptyStatement(void);
  2230. //
  2231.  
  2232. // 
  2233. // Rule 160:  LabeledStatement ::= Identifier COLON Statement
  2234. //
  2235. #line 2680 "java.g"
  2236. void Parser::MakeLabeledStatement(void)
  2237. {
  2238.     AstBlock *p = Sym(3) -> BlockCast();
  2239.  
  2240.     if (! (p && p -> NumStatements() == 1 &&
  2241.            (p -> Statement(0) -> kind == Ast::FOR   ||
  2242.             p -> Statement(0) -> kind == Ast::WHILE ||
  2243.             p -> Statement(0) -> kind == Ast::DO)))
  2244.     {
  2245.         //
  2246.         // When a statement is labeled, it is enclosed in a block.
  2247.         // This is necessary in order to allow the same name to be
  2248.         // reused to label a subsequent statement at the same nesting
  2249.         // level... See ProcessBlock, ProcessStatement,...
  2250.         //
  2251.         p = ast_pool -> NewBlock();
  2252.         p -> AllocateBlockStatements(1); // allocate 1 element
  2253.         p -> left_brace_token  = Token(1);
  2254.         p -> AddStatement((AstStatement *) Sym(3));
  2255.         p -> right_brace_token = Sym(3) -> RightToken();
  2256.     }
  2257.  
  2258.     p -> label_token_opt = Token(1); // add label to statement
  2259.     Sym(1) = p; // The final result is a block containing the labeled-statement
  2260. }
  2261.  
  2262. //
  2263. // Rule 161:  LabeledStatementNoShortIf ::= Identifier COLON StatementNoShortIf
  2264. //
  2265. // void MakeLabeledStatement(void);
  2266. //
  2267.  
  2268. // 
  2269. // Rule 162:  ExpressionStatement ::= StatementExpression SEMICOLON
  2270. //
  2271. #line 2717 "java.g"
  2272. void Parser::Act162(void)
  2273. {
  2274.     ((AstExpressionStatement *) Sym(1)) -> semicolon_token_opt = Token(2);
  2275. }
  2276.  
  2277. // 
  2278. // Rule 163:  StatementExpression ::= Assignment
  2279. //
  2280. #line 2726 "java.g"
  2281. void Parser::MakeExpressionStatement(void)
  2282. {
  2283.     AstExpressionStatement *p = ast_pool -> NewExpressionStatement();
  2284.     p -> expression          = (AstExpression *) Sym(1);
  2285.     p -> semicolon_token_opt = 0;
  2286.     Sym(1) = p;
  2287. }
  2288.  
  2289. //
  2290. // Rule 164:  StatementExpression ::= PreIncrementExpression
  2291. //
  2292. // void MakeExpressionStatement(void);
  2293. //
  2294.  
  2295. //
  2296. // Rule 165:  StatementExpression ::= PreDecrementExpression
  2297. //
  2298. // void MakeExpressionStatement(void);
  2299. //
  2300.  
  2301. //
  2302. // Rule 166:  StatementExpression ::= PostIncrementExpression
  2303. //
  2304. // void MakeExpressionStatement(void);
  2305. //
  2306.  
  2307. //
  2308. // Rule 167:  StatementExpression ::= PostDecrementExpression
  2309. //
  2310. // void MakeExpressionStatement(void);
  2311. //
  2312.  
  2313. //
  2314. // Rule 168:  StatementExpression ::= MethodInvocation
  2315. //
  2316. // void MakeExpressionStatement(void);
  2317. //
  2318.  
  2319. //
  2320. // Rule 169:  StatementExpression ::= ClassInstanceCreationExpression
  2321. //
  2322. // void MakeExpressionStatement(void);
  2323. //
  2324.  
  2325. // 
  2326. // Rule 170:  IfThenStatement ::= if LPAREN Expression RPAREN Statement
  2327. //
  2328. #line 2780 "java.g"
  2329. void Parser::Act170(void)
  2330. {
  2331.     AstBlock *block = Sym(5) -> BlockCast();
  2332.     if (! block)
  2333.     {
  2334.         block = ast_pool -> NewBlock();
  2335.         block -> AllocateBlockStatements(1); // allocate 1 element
  2336.         block -> left_brace_token  = Token(5);
  2337.         block -> AddStatement((AstStatement *) Sym(5));
  2338.         block -> right_brace_token = Sym(5) -> RightToken();
  2339.     }
  2340.  
  2341.     AstIfStatement *p = ast_pool -> NewIfStatement();
  2342.     p -> if_token            = Token(1);
  2343.     p -> expression          = (AstExpression *) Sym(3);
  2344.     p -> true_statement      = block;
  2345.     p -> false_statement_opt = NULL;
  2346.     Sym(1) = p;
  2347. }
  2348.  
  2349. // 
  2350. // Rule 171:  IfThenElseStatement ::= if LPAREN Expression RPAREN StatementNoShortIf else Statement
  2351. //
  2352. #line 2804 "java.g"
  2353. void Parser::MakeIfThenElseStatement(void)
  2354. {
  2355.     AstBlock *true_block = Sym(5) -> BlockCast();
  2356.     if (! true_block)
  2357.     {
  2358.         true_block = ast_pool -> NewBlock();
  2359.         true_block -> AllocateBlockStatements(1); // allocate 1 element
  2360.         true_block -> left_brace_token  = Token(5);
  2361.         true_block -> AddStatement((AstStatement *) Sym(5));
  2362.         true_block -> right_brace_token = Sym(5) -> RightToken();
  2363.     }
  2364.  
  2365.     AstBlock *false_block = Sym(7) -> BlockCast();
  2366.     if (! false_block)
  2367.     {
  2368.         false_block = ast_pool -> NewBlock();
  2369.         false_block -> AllocateBlockStatements(1); // allocate 1 element
  2370.         false_block -> left_brace_token  = Token(7);
  2371.         false_block -> AddStatement((AstStatement *) Sym(7));
  2372.         false_block -> right_brace_token = Sym(7) -> RightToken();
  2373.     }
  2374.  
  2375.     AstIfStatement *p = ast_pool -> NewIfStatement();
  2376.     p -> if_token            = Token(1);
  2377.     p -> expression          = (AstExpression *) Sym(3);
  2378.     p -> true_statement      = true_block;
  2379.     p -> false_statement_opt = false_block;
  2380.     Sym(1) = p;
  2381. }
  2382.  
  2383. //
  2384. // Rule 172:  IfThenElseStatementNoShortIf ::= if LPAREN Expression RPAREN StatementNoShortIf else StatementNoShortIf
  2385. //
  2386. // void MakeIfThenElseStatement(void);
  2387. //
  2388.  
  2389. // 
  2390. // Rule 173:  SwitchStatement ::= switch LPAREN Expression RPAREN SwitchBlock
  2391. //
  2392. #line 2845 "java.g"
  2393. void Parser::Act173(void)
  2394. {
  2395.     AstSwitchStatement *p = (AstSwitchStatement *) Sym(5);
  2396.     p -> switch_token = Token(1);
  2397.     p -> expression   = (AstExpression *) Sym(3);
  2398.     Sym(1) = p;
  2399. }
  2400.  
  2401. // 
  2402. // Rule 174:  SwitchBlock ::= LBRACE RBRACE
  2403. //
  2404. #line 2857 "java.g"
  2405. void Parser::Act174(void)
  2406. {
  2407.     AstSwitchStatement *p = ast_pool -> NewSwitchStatement();
  2408.  
  2409.     AstBlock *block = ast_pool -> NewBlock();
  2410.     block -> left_brace_token  = Token(1);
  2411.     block -> right_brace_token = Token(2);
  2412.  
  2413.     p -> switch_block = block;
  2414.  
  2415.     Sym(1) = p;
  2416. }
  2417.  
  2418. // 
  2419. // Rule 175:  SwitchBlock ::= LBRACE SwitchBlockStatements RBRACE
  2420. //
  2421. #line 2874 "java.g"
  2422. void Parser::Act175(void)
  2423. {
  2424.     AstSwitchStatement *p = ast_pool -> NewSwitchStatement();
  2425.  
  2426.     AstBlock *block = ast_pool -> NewBlock();
  2427.     block -> left_brace_token  = Token(1);
  2428.     if (Sym(2) != NULL)
  2429.     {
  2430.         AstListNode *tail = (AstListNode *) Sym(2);
  2431.         block -> AllocateBlockStatements(tail -> index + 1);
  2432.         AstListNode *root = tail;
  2433.         do
  2434.         {
  2435.             root = root -> next;
  2436.             block -> AddStatement((AstStatement *) root -> element);
  2437.         } while(root != tail);
  2438.         FreeCircularList(tail);
  2439.     }
  2440.     block -> right_brace_token = Token(3);
  2441.  
  2442.     p -> switch_block  = block;
  2443.  
  2444.     Sym(1) = p;
  2445. }
  2446.  
  2447. // 
  2448. // Rule 176:  SwitchBlock ::= LBRACE SwitchLabels RBRACE
  2449. //
  2450. #line 2903 "java.g"
  2451. void Parser::Act176(void)
  2452. {
  2453.     AstSwitchStatement *p = ast_pool -> NewSwitchStatement();
  2454.  
  2455.     AstSwitchBlockStatement *q = ast_pool -> NewSwitchBlockStatement();
  2456.     //
  2457.     // The list of SwitchBlockStatements is never null
  2458.     //
  2459.     {
  2460.         AstListNode *tail = (AstListNode *) Sym(2);
  2461.         q -> AllocateSwitchLabels(tail -> index + 1);
  2462.         AstListNode *root = tail;
  2463.         do
  2464.         {
  2465.             root = root -> next;
  2466.             q -> AddSwitchLabel((AstStatement *) root -> element);
  2467.         } while(root != tail);
  2468.         FreeCircularList(tail);
  2469.     }
  2470.  
  2471.     AstBlock *block = ast_pool -> NewBlock();
  2472.     block -> AllocateBlockStatements(1); // allocate 1 element
  2473.     block -> left_brace_token  = Token(1);
  2474.     block -> AddStatement(q);
  2475.     block -> right_brace_token = Token(3);
  2476.  
  2477.     p -> switch_block  = block;
  2478.  
  2479.     Sym(1) = p;
  2480. }
  2481.  
  2482. // 
  2483. // Rule 177:  SwitchBlock ::= LBRACE SwitchBlockStatements SwitchLabels RBRACE
  2484. //
  2485. #line 2938 "java.g"
  2486. void Parser::Act177(void)
  2487. {
  2488.     AstSwitchStatement *p = ast_pool -> NewSwitchStatement();
  2489.  
  2490.     AstBlock *block = ast_pool -> NewBlock();
  2491.     block -> left_brace_token  = Token(1);
  2492.     //
  2493.     // The list of SwitchBlockStatements is never null
  2494.     //
  2495.     {
  2496.         AstListNode *tail = (AstListNode *) Sym(2);
  2497.         block -> AllocateBlockStatements(tail -> index + 2); // +1 because of extra statement for additional SwithLabels
  2498.         AstListNode *root = tail;
  2499.         do
  2500.         {
  2501.             root = root -> next;
  2502.             block -> AddStatement((AstStatement *) root -> element);
  2503.         } while(root != tail);
  2504.         FreeCircularList(tail);
  2505.     }
  2506.  
  2507.     AstSwitchBlockStatement *q = ast_pool -> NewSwitchBlockStatement();
  2508.     //
  2509.     // The list of SwitchLabels is never null
  2510.     //
  2511.     {
  2512.         AstListNode *tail = (AstListNode *) Sym(3);
  2513.         q -> AllocateSwitchLabels(tail -> index + 1);
  2514.         AstListNode *root = tail;
  2515.         do
  2516.         {
  2517.             root = root -> next;
  2518.             q -> AddSwitchLabel(root -> element);
  2519.         } while(root != tail);
  2520.         FreeCircularList(tail);
  2521.     }
  2522.  
  2523.     block -> AddStatement(q);
  2524.     block -> right_brace_token = Token(4);
  2525.  
  2526.     p -> switch_block  = block;
  2527.  
  2528.     Sym(1) = p;
  2529. }
  2530.  
  2531. // 
  2532. // Rule 178:  SwitchBlockStatements ::= SwitchBlockStatement
  2533. //
  2534. #line 2987 "java.g"
  2535. //
  2536. // Note that the list is circular so as to preserve the order of the elements
  2537. //
  2538. void Parser::Act178(void)
  2539. {
  2540.     AstListNode *p = AllocateListNode();
  2541.     p -> next = p;
  2542.     p -> element = Sym(1);
  2543.     p -> index = 0;
  2544.  
  2545.     Sym(1) = p;
  2546. }
  2547.  
  2548. // 
  2549. // Rule 179:  SwitchBlockStatements ::= SwitchBlockStatements SwitchBlockStatement
  2550. //
  2551. #line 3004 "java.g"
  2552. //
  2553. // Note that the list is circular so as to preserve the order of the elements
  2554. //
  2555. void Parser::Act179(void)
  2556. {
  2557.     AstListNode *tail = (AstListNode *) Sym(1);
  2558.  
  2559.     AstListNode *p = AllocateListNode();
  2560.     p -> element = Sym(2);
  2561.     p -> index = tail -> index + 1;
  2562.  
  2563.     p -> next = tail -> next;
  2564.     tail -> next = p;
  2565.  
  2566.     Sym(1) = p;
  2567. }
  2568.  
  2569. // 
  2570. // Rule 180:  SwitchBlockStatement ::= SwitchLabels BlockStatements
  2571. //
  2572. #line 3025 "java.g"
  2573. void Parser::Act180(void)
  2574. {
  2575.     AstSwitchBlockStatement *p = ast_pool -> NewSwitchBlockStatement();
  2576.     //
  2577.     // The list of SwitchLabels is never null
  2578.     //
  2579.     {
  2580.         AstListNode *tail = (AstListNode *) Sym(1);
  2581.         p -> AllocateSwitchLabels(tail -> index + 1);
  2582.         AstListNode *root = tail;
  2583.         do
  2584.         {
  2585.             root = root -> next;
  2586.             p -> AddSwitchLabel(root -> element);
  2587.         } while(root != tail);
  2588.         FreeCircularList(tail);
  2589.     }
  2590.  
  2591.     //
  2592.     // The list of SwitchBlockStatements is never null
  2593.     //
  2594.     {
  2595.         AstListNode *tail = (AstListNode *) Sym(2);
  2596.         p -> AllocateBlockStatements(tail -> index + 1);
  2597.         AstListNode *root = tail;
  2598.         do
  2599.         {
  2600.             root = root -> next;
  2601.             p -> AddStatement((AstStatement *) root -> element);
  2602.         } while(root != tail);
  2603.         FreeCircularList(tail);
  2604.     }
  2605.     Sym(1) = p;
  2606. }
  2607.  
  2608. // 
  2609. // Rule 181:  SwitchLabels ::= SwitchLabel
  2610. //
  2611. #line 3064 "java.g"
  2612. //
  2613. // Note that the list is circular so as to preserve the order of the elements
  2614. //
  2615. void Parser::Act181(void)
  2616. {
  2617.     AstListNode *p = AllocateListNode();
  2618.     p -> next = p;
  2619.     p -> element = Sym(1);
  2620.     p -> index = 0;
  2621.  
  2622.     Sym(1) = p;
  2623. }
  2624.  
  2625. // 
  2626. // Rule 182:  SwitchLabels ::= SwitchLabels SwitchLabel
  2627. //
  2628. #line 3081 "java.g"
  2629. //
  2630. // Note that the list is circular so as to preserve the order of the elements
  2631. //
  2632. void Parser::Act182(void)
  2633. {
  2634.     AstListNode *tail = (AstListNode *) Sym(1);
  2635.  
  2636.     AstListNode *p = AllocateListNode();
  2637.     p -> element = Sym(2);
  2638.     p -> index = tail -> index + 1;
  2639.  
  2640.     p -> next = tail -> next;
  2641.     tail -> next = p;
  2642.  
  2643.     Sym(1) = p;
  2644. }
  2645.  
  2646. // 
  2647. // Rule 183:  SwitchLabel ::= case ConstantExpression COLON
  2648. //
  2649. #line 3102 "java.g"
  2650. void Parser::Act183(void)
  2651. {
  2652.     AstCaseLabel *p = ast_pool -> NewCaseLabel();
  2653.     p -> case_token  = Token(1);
  2654.     p -> expression  = (AstExpression *) Sym(2);
  2655.     p -> colon_token = Token(3);
  2656.     Sym(1) = p;
  2657. }
  2658.  
  2659. // 
  2660. // Rule 184:  SwitchLabel ::= default COLON
  2661. //
  2662. #line 3115 "java.g"
  2663. void Parser::Act184(void)
  2664. {
  2665.     AstDefaultLabel *p = ast_pool -> NewDefaultLabel();
  2666.     p -> default_token = Token(1);
  2667.     p -> colon_token   = Token(2);
  2668.     Sym(1) = p;
  2669. }
  2670.  
  2671. // 
  2672. // Rule 185:  WhileStatement ::= while LPAREN Expression RPAREN Statement
  2673. //
  2674. #line 3127 "java.g"
  2675. void Parser::MakeWhileStatement(void)
  2676. {
  2677.     AstWhileStatement *p = ast_pool -> NewWhileStatement();
  2678.     p -> while_token = Token(1);
  2679.     p -> expression  = (AstExpression *) Sym(3);
  2680.     p -> statement   = (AstStatement *) Sym(5);
  2681.  
  2682.     AstBlock *block = ast_pool -> NewBlock();
  2683.     block -> AllocateBlockStatements(1); // allocate 1 element
  2684.     block -> left_brace_token  = Token(1); // point to 'FOR' keyword
  2685.     block -> AddStatement(p);
  2686.     block -> right_brace_token = Sym(5) -> RightToken(); // point to last token in statement
  2687.  
  2688.     Sym(1) = block;
  2689. }
  2690.  
  2691. //
  2692. // Rule 186:  WhileStatementNoShortIf ::= while LPAREN Expression RPAREN StatementNoShortIf
  2693. //
  2694. // void MakeWhileStatement(void);
  2695. //
  2696.  
  2697. // 
  2698. // Rule 187:  DoStatement ::= do Statement while LPAREN Expression RPAREN SEMICOLON
  2699. //
  2700. #line 3154 "java.g"
  2701. void Parser::Act187(void)
  2702. {
  2703.     AstDoStatement *p = ast_pool -> NewDoStatement();
  2704.     p -> do_token        = Token(1);
  2705.     p -> statement       = (AstStatement *) Sym(2);
  2706.     p -> while_token     = Token(3);
  2707.     p -> expression      = (AstExpression *) Sym(5);
  2708.     p -> semicolon_token = Token(7);
  2709.  
  2710.     AstBlock *block = ast_pool -> NewBlock();
  2711.     block -> AllocateBlockStatements(1); // allocate 1 element
  2712.     block -> left_brace_token  = Token(1);
  2713.     block -> AddStatement(p);
  2714.     block -> right_brace_token = Token(7);
  2715.  
  2716.     Sym(1) = block;
  2717. }
  2718.  
  2719. // 
  2720. // Rule 188:  ForStatement ::= for LPAREN ForInitopt SEMICOLON Expressionopt SEMICOLON ForUpdateopt RPAREN Statement
  2721. //
  2722. #line 3176 "java.g"
  2723. void Parser::MakeForStatement(void)
  2724. {
  2725.     AstForStatement *p = ast_pool -> NewForStatement();
  2726.     p -> for_token = Token(1);
  2727.     if (Sym(3) != NULL)
  2728.     {
  2729.         AstListNode *tail = (AstListNode *) Sym(3);
  2730.         p -> AllocateForInitStatements(tail -> index + 1);
  2731.         AstListNode *root = tail;
  2732.         do
  2733.         {
  2734.             root = root -> next;
  2735.             p -> AddForInitStatement((AstStatement *) root -> element);
  2736.         } while(root != tail);
  2737.         FreeCircularList(tail);
  2738.     }
  2739.     p -> end_expression_opt = (AstExpression *) Sym(5);
  2740.     if (Sym(7) != NULL)
  2741.     {
  2742.         AstListNode *tail = (AstListNode *) Sym(7);
  2743.         p -> AllocateForUpdateStatements(tail -> index + 1);
  2744.         AstListNode *root = tail;
  2745.         do
  2746.         {
  2747.             root = root -> next;
  2748.             p -> AddForUpdateStatement((AstExpressionStatement *) root -> element);
  2749.         } while(root != tail);
  2750.         FreeCircularList(tail);
  2751.     }
  2752.     p -> statement = (AstStatement *) Sym(9);
  2753.  
  2754.     AstBlock *block = ast_pool -> NewBlock();
  2755.     block -> AllocateBlockStatements(1); // allocate 1 element
  2756.     block -> left_brace_token  = Token(1);
  2757.     block -> AddStatement(p);
  2758.     block -> right_brace_token = Sym(9) -> RightToken();
  2759.  
  2760.     Sym(1) = block;
  2761. }
  2762.  
  2763. //
  2764. // Rule 189:  ForStatementNoShortIf ::= for LPAREN ForInitopt SEMICOLON Expressionopt SEMICOLON ForUpdateopt RPAREN...
  2765. //
  2766. // void MakeForStatement(void);
  2767. //
  2768.  
  2769. //
  2770. // Rule 190:  ForInit -> StatementExpressionList
  2771. //
  2772. // void NoAction(void);
  2773. //
  2774.  
  2775. // 
  2776. // Rule 191:  ForInit ::= LocalVariableDeclaration
  2777. //
  2778. #line 3231 "java.g"
  2779. //
  2780. // Note that the list is circular so as to preserve the order of the elements
  2781. //
  2782. void Parser::Act191(void)
  2783. {
  2784.     AstListNode *p = AllocateListNode();
  2785.     p -> next = p;
  2786.     p -> element = Sym(1);
  2787.     p -> index = 0;
  2788.  
  2789.     Sym(1) = p;
  2790. }
  2791.  
  2792. //
  2793. // Rule 192:  ForUpdate -> StatementExpressionList
  2794. //
  2795. // void NoAction(void);
  2796. //
  2797.  
  2798. // 
  2799. // Rule 193:  StatementExpressionList ::= StatementExpression
  2800. //
  2801. #line 3252 "java.g"
  2802. //
  2803. // Note that the list is circular so as to preserve the order of the elements
  2804. //
  2805. void Parser::Act193(void)
  2806. {
  2807.     AstListNode *p = AllocateListNode();
  2808.     p -> next = p;
  2809.     p -> element = Sym(1);
  2810.     p -> index = 0;
  2811.  
  2812.     Sym(1) = p;
  2813. }
  2814.  
  2815. // 
  2816. // Rule 194:  StatementExpressionList ::= StatementExpressionList COMMA StatementExpression
  2817. //
  2818. #line 3269 "java.g"
  2819. //
  2820. // Note that the list is circular so as to preserve the order of the elements
  2821. //
  2822. void Parser::Act194(void)
  2823. {
  2824.     AstListNode *tail = (AstListNode *) Sym(1);
  2825.  
  2826.     AstListNode *p = AllocateListNode();
  2827.     p -> element = Sym(3);
  2828.     p -> index = tail -> index + 1;
  2829.  
  2830.     p -> next = tail -> next;
  2831.     tail -> next = p;
  2832.  
  2833.     Sym(1) = p;
  2834. }
  2835.  
  2836. // 
  2837. // Rule 195:  BreakStatement ::= break SEMICOLON
  2838. //
  2839. #line 3296 "java.g"
  2840. void Parser::Act195(void)
  2841. {
  2842.     AstBreakStatement *p = ast_pool -> NewBreakStatement();
  2843.     p -> break_token          = Token(1);
  2844.     p -> identifier_token_opt = 0;
  2845.     p -> semicolon_token      = Token(2);
  2846.     Sym(1) = p;
  2847. }
  2848.  
  2849. // 
  2850. // Rule 196:  BreakStatement ::= break Identifier SEMICOLON
  2851. //
  2852. #line 3309 "java.g"
  2853. void Parser::Act196(void)
  2854. {
  2855.     AstBreakStatement *p = ast_pool -> NewBreakStatement();
  2856.     p -> break_token          = Token(1);
  2857.     p -> identifier_token_opt = Token(2);
  2858.     p -> semicolon_token      = Token(3);
  2859.     Sym(1) = p;
  2860. }
  2861.  
  2862. // 
  2863. // Rule 197:  ContinueStatement ::= continue SEMICOLON
  2864. //
  2865. #line 3322 "java.g"
  2866. void Parser::Act197(void)
  2867. {
  2868.     AstContinueStatement *p = ast_pool -> NewContinueStatement();
  2869.     p -> continue_token       = Token(1);
  2870.     p -> identifier_token_opt = 0;
  2871.     p -> semicolon_token      = Token(2);
  2872.     Sym(1) = p;
  2873. }
  2874.  
  2875. // 
  2876. // Rule 198:  ContinueStatement ::= continue Identifier SEMICOLON
  2877. //
  2878. #line 3335 "java.g"
  2879. void Parser::Act198(void)
  2880. {
  2881.     AstContinueStatement *p = ast_pool -> NewContinueStatement();
  2882.     p -> continue_token       = Token(1);
  2883.     p -> identifier_token_opt = Token(2);
  2884.     p -> semicolon_token      = Token(3);
  2885.     Sym(1) = p;
  2886. }
  2887.  
  2888. // 
  2889. // Rule 199:  ReturnStatement ::= return Expressionopt SEMICOLON
  2890. //
  2891. #line 3348 "java.g"
  2892. void Parser::Act199(void)
  2893. {
  2894.     AstReturnStatement *p = ast_pool -> NewReturnStatement();
  2895.     p -> return_token    = Token(1);
  2896.     p -> expression_opt  = (AstExpression *) Sym(2);
  2897.     p -> semicolon_token = Token(3);
  2898.     Sym(1) = p;
  2899. }
  2900.  
  2901. // 
  2902. // Rule 200:  ThrowStatement ::= throw Expression SEMICOLON
  2903. //
  2904. #line 3361 "java.g"
  2905. void Parser::Act200(void)
  2906. {
  2907.     AstThrowStatement *p = ast_pool -> NewThrowStatement();
  2908.     p -> throw_token     = Token(1);
  2909.     p -> expression      = (AstExpression *) Sym(2);
  2910.     p -> semicolon_token = Token(3);
  2911.     Sym(1) = p;
  2912. }
  2913.  
  2914. // 
  2915. // Rule 201:  SynchronizedStatement ::= synchronized LPAREN Expression RPAREN Block
  2916. //
  2917. #line 3374 "java.g"
  2918. void Parser::Act201(void)
  2919. {
  2920.     AstSynchronizedStatement *p = ast_pool -> NewSynchronizedStatement();
  2921.     p -> synchronized_token = Token(1);
  2922.     p -> expression         = (AstExpression *) Sym(3);
  2923.     p -> block              = (AstBlock *) Sym(5);
  2924.     Sym(1) = p;
  2925. }
  2926.  
  2927. // 
  2928. // Rule 202:  TryStatement ::= try Block Catches
  2929. //
  2930. #line 3387 "java.g"
  2931. void Parser::Act202(void)
  2932. {
  2933.     AstTryStatement *p = ast_pool -> NewTryStatement();
  2934.     p -> try_token          = Token(1);
  2935.     p -> block              = (AstBlock *) Sym(2);
  2936.     //
  2937.     // The list of modifiers is guaranteed not empty
  2938.     //
  2939.     {
  2940.         AstListNode *tail = (AstListNode *) Sym(3);
  2941.         p -> AllocateCatchClauses(tail -> index + 1);
  2942.         AstListNode *root = tail;
  2943.         do
  2944.         {
  2945.             root = root -> next;
  2946.             p -> AddCatchClause((AstCatchClause *) root -> element);
  2947.         } while(root != tail);
  2948.         FreeCircularList(tail);
  2949.     }
  2950.     p -> finally_clause_opt = NULL;
  2951.     Sym(1) = p;
  2952. }
  2953.  
  2954. // 
  2955. // Rule 203:  TryStatement ::= try Block Catchesopt Finally
  2956. //
  2957. #line 3414 "java.g"
  2958. void Parser::Act203(void)
  2959. {
  2960.     AstTryStatement *p = ast_pool -> NewTryStatement();
  2961.     p -> try_token      = Token(1);
  2962.     p -> block          = (AstBlock *) Sym(2);
  2963.     if (Sym(3) != NULL)
  2964.     {
  2965.         AstListNode *tail = (AstListNode *) Sym(3);
  2966.         p -> AllocateCatchClauses(tail -> index + 1);
  2967.         AstListNode *root = tail;
  2968.         do
  2969.         {
  2970.             root = root -> next;
  2971.             p -> AddCatchClause((AstCatchClause *) root -> element);
  2972.         } while(root != tail);
  2973.         FreeCircularList(tail);
  2974.     }
  2975.     p -> finally_clause_opt = (AstFinallyClause *) Sym(4);
  2976.     Sym(1) = p;
  2977. }
  2978.  
  2979. // 
  2980. // Rule 204:  Catches ::= CatchClause
  2981. //
  2982. #line 3439 "java.g"
  2983. //
  2984. // Note that the list is circular so as to preserve the order of the elements
  2985. //
  2986. void Parser::Act204(void)
  2987. {
  2988.     AstListNode *p = AllocateListNode();
  2989.     p -> next = p;
  2990.     p -> element = Sym(1);
  2991.     p -> index = 0;
  2992.  
  2993.     Sym(1) = p;
  2994. }
  2995.  
  2996. // 
  2997. // Rule 205:  Catches ::= Catches CatchClause
  2998. //
  2999. #line 3456 "java.g"
  3000. //
  3001. // Note that the list is circular so as to preserve the order of the elements
  3002. //
  3003. void Parser::Act205(void)
  3004. {
  3005.     AstListNode *tail = (AstListNode *) Sym(1);
  3006.  
  3007.     AstListNode *p = AllocateListNode();
  3008.     p -> element = Sym(2);
  3009.     p -> index = tail -> index + 1;
  3010.  
  3011.     p -> next = tail -> next;
  3012.     tail -> next = p;
  3013.  
  3014.     Sym(1) = p;
  3015. }
  3016.  
  3017. // 
  3018. // Rule 206:  CatchClause ::= catch LPAREN FormalParameter RPAREN Block
  3019. //
  3020. #line 3477 "java.g"
  3021. void Parser::Act206(void)
  3022. {
  3023.     AstCatchClause *p = ast_pool -> NewCatchClause();
  3024.     p -> catch_token      = Token(1);
  3025.     p -> formal_parameter = (AstFormalParameter *) Sym(3);
  3026.     p -> block            = (AstBlock *) Sym(5);
  3027.     Sym(1) = p;
  3028. }
  3029.  
  3030. // 
  3031. // Rule 207:  Finally ::= finally Block
  3032. //
  3033. #line 3490 "java.g"
  3034. void Parser::Act207(void)
  3035. {
  3036.     AstFinallyClause *p = ast_pool -> NewFinallyClause();
  3037.     p -> finally_token = Token(1);
  3038.     p -> block         = (AstBlock *) Sym(2);
  3039.     Sym(1) = p;
  3040. }
  3041.  
  3042. //
  3043. // Rule 208:  Primary -> PrimaryNoNewArray
  3044. //
  3045. // void NoAction(void);
  3046. //
  3047.  
  3048. //
  3049. // Rule 209:  Primary -> ArrayCreationExpression
  3050. //
  3051. // void NoAction(void);
  3052. //
  3053.  
  3054. //
  3055. // Rule 210:  PrimaryNoNewArray -> Literal
  3056. //
  3057. // void NoAction(void);
  3058. //
  3059.  
  3060. // 
  3061. // Rule 211:  PrimaryNoNewArray ::= this
  3062. //
  3063. #line 3516 "java.g"
  3064. void Parser::Act211(void)
  3065. {
  3066.     Sym(1) = ast_pool -> NewThisExpression(Token(1));
  3067. }
  3068.  
  3069. // 
  3070. // Rule 212:  PrimaryNoNewArray ::= LPAREN Expression RPAREN
  3071. //
  3072. #line 3525 "java.g"
  3073. void Parser::Act212(void)
  3074. {
  3075.     AstParenthesizedExpression *p = ast_pool -> NewParenthesizedExpression();
  3076.     p -> left_parenthesis_token = Token(1);
  3077.     p -> expression = (AstExpression *) Sym(2);
  3078.     p -> right_parenthesis_token = Token(3);
  3079.     Sym(1) = p;
  3080. }
  3081.  
  3082. //
  3083. // Rule 213:  PrimaryNoNewArray -> ClassInstanceCreationExpression
  3084. //
  3085. // void NoAction(void);
  3086. //
  3087.  
  3088. //
  3089. // Rule 214:  PrimaryNoNewArray -> FieldAccess
  3090. //
  3091. // void NoAction(void);
  3092. //
  3093.  
  3094. // 
  3095. // Rule 215:  PrimaryNoNewArray ::= Name DOT this
  3096. //
  3097. #line 3547 "java.g"
  3098. void Parser::Act215(void)
  3099. {
  3100.     AstFieldAccess *p = ast_pool -> NewFieldAccess(AstFieldAccess::THIS_TAG);
  3101.     p -> base = (AstExpression *) Sym(1);
  3102.     p -> dot_token = Token(2);
  3103.     p -> identifier_token = Token(3);
  3104.     Sym(1) = p;
  3105. }
  3106.  
  3107. // 
  3108. // Rule 216:  PrimaryNoNewArray ::= Type DOT class
  3109. //
  3110. #line 3561 "java.g"
  3111. void Parser::Act216(void)
  3112. {
  3113.     AstFieldAccess *p = ast_pool -> NewFieldAccess(AstFieldAccess::CLASS_TAG);
  3114.     p -> base = ast_pool -> NewTypeExpression(Sym(1));
  3115.     p -> dot_token = Token(2);
  3116.     p -> identifier_token = Token(3);
  3117.     Sym(1) = p;
  3118. }
  3119.  
  3120. // 
  3121. // Rule 217:  PrimaryNoNewArray ::= void DOT class
  3122. //
  3123. #line 3575 "java.g"
  3124. void Parser::Act217(void)
  3125. {
  3126.     AstFieldAccess *p = ast_pool -> NewFieldAccess(AstFieldAccess::CLASS_TAG);
  3127.     p -> base = ast_pool -> NewTypeExpression(ast_pool -> NewPrimitiveType(Ast::VOID_TYPE, Token(1)));
  3128.     p -> dot_token = Token(2);
  3129.     p -> identifier_token = Token(3);
  3130.     Sym(1) = p;
  3131. }
  3132.  
  3133. //
  3134. // Rule 218:  PrimaryNoNewArray -> MethodInvocation
  3135. //
  3136. // void NoAction(void);
  3137. //
  3138.  
  3139. //
  3140. // Rule 219:  PrimaryNoNewArray -> ArrayAccess
  3141. //
  3142. // void NoAction(void);
  3143. //
  3144.  
  3145. // 
  3146. // Rule 220:  ClassInstanceCreationExpression ::= new ClassType LPAREN ArgumentListopt RPAREN ClassBodyopt
  3147. //
  3148. #line 3601 "java.g"
  3149. void Parser::Act220(void)
  3150. {
  3151.     AstClassInstanceCreationExpression *p = ast_pool -> NewClassInstanceCreationExpression();
  3152.     p -> base_opt                = NULL;
  3153.     p -> dot_token_opt           = 0;
  3154.     p -> new_token               = Token(1);
  3155.     p -> class_type              = ast_pool -> NewTypeExpression(Sym(2));
  3156.     p -> left_parenthesis_token  = Token(3);
  3157.     if (Sym(4) != NULL)
  3158.     {
  3159.         AstListNode *tail = (AstListNode *) Sym(4);
  3160.         p -> AllocateArguments(tail -> index + 1);
  3161.         AstListNode *root = tail;
  3162.         do
  3163.         {
  3164.             root = root -> next;
  3165.             p -> AddArgument((AstExpression *) root -> element);
  3166.         } while(root != tail);
  3167.         FreeCircularList(tail);
  3168.     }
  3169.     p -> right_parenthesis_token = Token(5);
  3170.     p -> class_body_opt          = (AstClassBody *) Sym(6);
  3171.     Sym(1) = p;
  3172. }
  3173.  
  3174. // 
  3175. // Rule 221:  ClassInstanceCreationExpression ::= Primary DOT new SimpleName LPAREN ArgumentListopt RPAREN ClassBodyopt
  3176. //
  3177. #line 3631 "java.g"
  3178. void Parser::MakeQualifiedNew(void)
  3179. {
  3180.     AstClassInstanceCreationExpression *p = ast_pool -> NewClassInstanceCreationExpression();
  3181.     p -> base_opt                = (AstExpression *) Sym(1);
  3182.     p -> dot_token_opt           = Token(2);
  3183.     p -> new_token               = Token(3);
  3184.     p -> class_type              = ast_pool -> NewTypeExpression(Sym(4));
  3185.     p -> left_parenthesis_token  = Token(5);
  3186.     if (Sym(6) != NULL)
  3187.     {
  3188.         AstListNode *tail = (AstListNode *) Sym(6);
  3189.         p -> AllocateArguments(tail -> index + 1);
  3190.         AstListNode *root = tail;
  3191.         do
  3192.         {
  3193.             root = root -> next;
  3194.             p -> AddArgument((AstExpression *) root -> element);
  3195.         } while(root != tail);
  3196.         FreeCircularList(tail);
  3197.     }
  3198.     p -> right_parenthesis_token = Token(7);
  3199.     p -> class_body_opt          = (AstClassBody *) Sym(8);
  3200.     Sym(1) = p;
  3201. }
  3202.  
  3203. //
  3204. // Rule 222:  ClassInstanceCreationExpression ::= Name DOT new SimpleName LPAREN ArgumentListopt RPAREN ClassBodyopt
  3205. //
  3206. // void MakeQualifiedNew(void);
  3207. //
  3208.  
  3209. // 
  3210. // Rule 223:  ArgumentList ::= Expression
  3211. //
  3212. #line 3668 "java.g"
  3213. //
  3214. // Note that the list is circular so as to preserve the order of the elements
  3215. //
  3216. void Parser::Act223(void)
  3217. {
  3218.     AstListNode *p = AllocateListNode();
  3219.     p -> next = p;
  3220.     p -> element = Sym(1);
  3221.     p -> index = 0;
  3222.  
  3223.     Sym(1) = p;
  3224. }
  3225.  
  3226. // 
  3227. // Rule 224:  ArgumentList ::= ArgumentList COMMA Expression
  3228. //
  3229. #line 3685 "java.g"
  3230. //
  3231. // Note that the list is circular so as to preserve the order of the elements
  3232. //
  3233. void Parser::Act224(void)
  3234. {
  3235.     AstListNode *tail = (AstListNode *) Sym(1);
  3236.  
  3237.     AstListNode *p = AllocateListNode();
  3238.     p -> element = Sym(3);
  3239.     p -> index = tail -> index + 1;
  3240.  
  3241.     p -> next = tail -> next;
  3242.     tail -> next = p;
  3243.  
  3244.     Sym(1) = p;
  3245. }
  3246.  
  3247. // 
  3248. // Rule 225:  ArrayCreationExpression ::= new PrimitiveType DimExprs Dimsopt
  3249. //
  3250. #line 3706 "java.g"
  3251. void Parser::MakeArrayCreationExpression(void)
  3252. {
  3253.     AstArrayCreationExpression *p = ast_pool -> NewArrayCreationExpression();
  3254.     p -> new_token             = Token(1);
  3255.     p -> array_type            = Sym(2);
  3256.     //
  3257.     // The list of DimExprs is never null
  3258.     //
  3259.     {
  3260.         AstListNode *tail = (AstListNode *) Sym(3);
  3261.         p -> AllocateDimExprs(tail -> index + 1);
  3262.         AstListNode *root = tail;
  3263.         do
  3264.         {
  3265.             root = root -> next;
  3266.             p -> AddDimExpr((AstDimExpr *) root -> element);
  3267.         } while(root != tail);
  3268.         FreeCircularList(tail);
  3269.     }
  3270.  
  3271.     if (Sym(4) != NULL)
  3272.     {
  3273.         AstListNode *tail = (AstListNode *) Sym(4);
  3274.         p -> AllocateBrackets(tail -> index + 1);
  3275.         AstListNode *root = tail;
  3276.         do
  3277.         {
  3278.             root = root -> next;
  3279.             p -> AddBrackets((AstBrackets *) root -> element);
  3280.         } while(root != tail);
  3281.         FreeCircularList(tail);
  3282.     }
  3283.     p -> array_initializer_opt = NULL;
  3284.     Sym(1) = p;
  3285. }
  3286.  
  3287. //
  3288. // Rule 226:  ArrayCreationExpression ::= new ClassOrInterfaceType DimExprs Dimsopt
  3289. //
  3290. // void MakeArrayCreationExpression(void);
  3291. //
  3292.  
  3293. // 
  3294. // Rule 227:  ArrayCreationExpression ::= new ArrayType ArrayInitializer
  3295. //
  3296. #line 3754 "java.g"
  3297. void Parser::Act227(void)
  3298. {
  3299.     AstArrayCreationExpression *p = ast_pool -> NewArrayCreationExpression();
  3300.     p -> new_token             = Token(1);
  3301.     p -> array_type            = Sym(2);
  3302.     p -> array_initializer_opt = (AstArrayInitializer *) Sym(3);
  3303.     Sym(1) = p;
  3304. }
  3305.  
  3306. // 
  3307. // Rule 228:  DimExprs ::= DimExpr
  3308. //
  3309. #line 3767 "java.g"
  3310. //
  3311. // Note that the list is circular so as to preserve the order of the elements
  3312. //
  3313. void Parser::Act228(void)
  3314. {
  3315.     AstListNode *p = AllocateListNode();
  3316.     p -> next = p;
  3317.     p -> element = Sym(1);
  3318.     p -> index = 0;
  3319.  
  3320.     Sym(1) = p;
  3321. }
  3322.  
  3323. // 
  3324. // Rule 229:  DimExprs ::= DimExprs DimExpr
  3325. //
  3326. #line 3784 "java.g"
  3327. //
  3328. // Note that the list is circular so as to preserve the order of the elements
  3329. //
  3330. void Parser::Act229(void)
  3331. {
  3332.     AstListNode *tail = (AstListNode *) Sym(1);
  3333.  
  3334.     AstListNode *p = AllocateListNode();
  3335.     p -> element = Sym(2);
  3336.     p -> index = tail -> index + 1;
  3337.  
  3338.     p -> next = tail -> next;
  3339.     tail -> next = p;
  3340.  
  3341.     Sym(1) = p;
  3342. }
  3343.  
  3344. // 
  3345. // Rule 230:  DimExpr ::= LBRACKET Expression RBRACKET
  3346. //
  3347. #line 3805 "java.g"
  3348. void Parser::Act230(void)
  3349. {
  3350.     AstDimExpr *p = ast_pool -> NewDimExpr();
  3351.     p -> left_bracket_token  = Token(1);
  3352.     p -> expression          = (AstExpression *) Sym(2);
  3353.     p -> right_bracket_token = Token(3);
  3354.     Sym(1) = p;
  3355. }
  3356.  
  3357. // 
  3358. // Rule 231:  Dims ::= LBRACKET RBRACKET
  3359. //
  3360. #line 3818 "java.g"
  3361. //
  3362. // Note that the list is circular so as to preserve the order of the elements
  3363. //
  3364. void Parser::Act231(void)
  3365. {
  3366.     AstListNode *p = AllocateListNode();
  3367.     p -> next = p;
  3368.     p -> element = ast_pool -> NewBrackets(Token(1), Token(2));
  3369.     p -> index = 0;
  3370.  
  3371.     Sym(1) = p;
  3372. }
  3373.  
  3374. // 
  3375. // Rule 232:  Dims ::= Dims LBRACKET RBRACKET
  3376. //
  3377. #line 3835 "java.g"
  3378. //
  3379. // Note that the list is circular so as to preserve the order of the elements
  3380. //
  3381. void Parser::Act232(void)
  3382. {
  3383.     AstListNode *tail = (AstListNode *) Sym(1);
  3384.  
  3385.     AstListNode *p = AllocateListNode();
  3386.     p -> element = ast_pool -> NewBrackets(Token(2), Token(3));
  3387.     p -> index = tail -> index + 1;
  3388.  
  3389.     p -> next = tail -> next;
  3390.     tail -> next = p;
  3391.  
  3392.     Sym(1) = p;
  3393. }
  3394.  
  3395. //
  3396. // Rule 233:  FieldAccess ::= Primary DOT Identifier
  3397. //
  3398. // void MakeFieldAccess(void);
  3399. //
  3400.  
  3401. // 
  3402. // Rule 234:  FieldAccess ::= super DOT Identifier
  3403. //
  3404. #line 3863 "java.g"
  3405. void Parser::MakeSuperFieldAccess(void)
  3406. {
  3407.     Sym(1) = ast_pool -> NewSuperExpression(Token(1));
  3408.  
  3409.     MakeFieldAccess();
  3410. }
  3411.  
  3412. // 
  3413. // Rule 235:  FieldAccess ::= Name DOT super DOT Identifier
  3414. //
  3415. #line 3875 "java.g"
  3416. void Parser::MakeSuperDoubleFieldAccess(void)
  3417. {
  3418.     AstFieldAccess *p = ast_pool -> NewFieldAccess();
  3419.  
  3420.          AstFieldAccess *q = ast_pool -> NewFieldAccess(AstFieldAccess::SUPER_TAG);
  3421.          q -> base = (AstExpression *) Sym(1);
  3422.          q -> dot_token = Token(2);
  3423.          q -> identifier_token = Token(3);
  3424.  
  3425.     p -> base = q;
  3426.     p -> dot_token = Token(4);
  3427.     p -> identifier_token = Token(5);
  3428.  
  3429.     Sym(1) = p;
  3430. }
  3431.  
  3432. // 
  3433. // Rule 236:  MethodInvocation ::= Name LPAREN ArgumentListopt RPAREN
  3434. //
  3435. #line 3895 "java.g"
  3436. void Parser::Act236(void)
  3437. {
  3438.     AstMethodInvocation *p = ast_pool -> NewMethodInvocation();
  3439.     p -> method                  = (AstExpression *) Sym(1);
  3440.     p -> left_parenthesis_token  = Token(2);
  3441.     if (Sym(3) != NULL)
  3442.     {
  3443.         AstListNode *tail = (AstListNode *) Sym(3);
  3444.         p -> AllocateArguments(tail -> index + 1);
  3445.         AstListNode *root = tail;
  3446.         do
  3447.         {
  3448.             root = root -> next;
  3449.             p -> AddArgument((AstExpression *) root -> element);
  3450.         } while(root != tail);
  3451.         FreeCircularList(tail);
  3452.     }
  3453.     p -> right_parenthesis_token = Token(4);
  3454.     Sym(1) = p;
  3455. }
  3456.  
  3457. // 
  3458. // Rule 237:  MethodInvocation ::= Primary DOT Identifier LPAREN ArgumentListopt RPAREN
  3459. //
  3460. #line 3920 "java.g"
  3461. void Parser::Act237(void)
  3462. {
  3463.     MakeFieldAccess();
  3464.  
  3465.     AstMethodInvocation *p = ast_pool -> NewMethodInvocation();
  3466.     p -> method                  = (AstExpression *) Sym(1);
  3467.     p -> left_parenthesis_token  = Token(4);
  3468.     if (Sym(5) != NULL)
  3469.     {
  3470.         AstListNode *tail = (AstListNode *) Sym(5);
  3471.         p -> AllocateArguments(tail -> index + 1);
  3472.         AstListNode *root = tail;
  3473.         do
  3474.         {
  3475.             root = root -> next;
  3476.             p -> AddArgument((AstExpression *) root -> element);
  3477.         } while(root != tail);
  3478.         FreeCircularList(tail);
  3479.     }
  3480.     p -> right_parenthesis_token = Token(6);
  3481.     Sym(1) = p;
  3482. }
  3483.  
  3484. // 
  3485. // Rule 238:  MethodInvocation ::= super DOT Identifier LPAREN ArgumentListopt RPAREN
  3486. //
  3487. #line 3947 "java.g"
  3488. void Parser::Act238(void)
  3489. {
  3490.     MakeSuperFieldAccess();
  3491.  
  3492.     AstMethodInvocation *p = ast_pool -> NewMethodInvocation();
  3493.     p -> method                  = (AstExpression *) Sym(1);
  3494.     p -> left_parenthesis_token  = Token(4);
  3495.     if (Sym(5) != NULL)
  3496.     {
  3497.         AstListNode *tail = (AstListNode *) Sym(5);
  3498.         p -> AllocateArguments(tail -> index + 1);
  3499.         AstListNode *root = tail;
  3500.         do
  3501.         {
  3502.             root = root -> next;
  3503.             p -> AddArgument((AstExpression *) root -> element);
  3504.         } while(root != tail);
  3505.         FreeCircularList(tail);
  3506.     }
  3507.     p -> right_parenthesis_token = Token(6);
  3508.     Sym(1) = p;
  3509. }
  3510.  
  3511. // 
  3512. // Rule 239:  MethodInvocation ::= Name DOT super DOT Identifier LPAREN ArgumentListopt RPAREN
  3513. //
  3514. #line 3975 "java.g"
  3515. void Parser::Act239(void)
  3516. {
  3517.     MakeSuperDoubleFieldAccess();
  3518.  
  3519.     AstMethodInvocation *p = ast_pool -> NewMethodInvocation();
  3520.     p -> method                  = (AstExpression *) Sym(1);
  3521.     p -> left_parenthesis_token  = Token(6);
  3522.     if (Sym(7) != NULL)
  3523.     {
  3524.         AstListNode *tail = (AstListNode *) Sym(7);
  3525.         p -> AllocateArguments(tail -> index + 1);
  3526.         AstListNode *root = tail;
  3527.         do
  3528.         {
  3529.             root = root -> next;
  3530.             p -> AddArgument((AstExpression *) root -> element);
  3531.         } while(root != tail);
  3532.         FreeCircularList(tail);
  3533.     }
  3534.     p -> right_parenthesis_token = Token(8);
  3535.     Sym(1) = p;
  3536. }
  3537.  
  3538. // 
  3539. // Rule 240:  ArrayAccess ::= Name LBRACKET Expression RBRACKET
  3540. //
  3541. #line 4002 "java.g"
  3542. void Parser::MakeArrayAccess(void)
  3543. {
  3544.     AstArrayAccess *p = ast_pool -> NewArrayAccess();
  3545.     p -> base                = (AstExpression *) Sym(1);
  3546.     p -> left_bracket_token  = Token(2);
  3547.     p -> expression          = (AstExpression *) Sym(3);
  3548.     p -> right_bracket_token = Token(4);
  3549.     Sym(1) = p;
  3550. }
  3551.  
  3552. //
  3553. // Rule 241:  ArrayAccess ::= PrimaryNoNewArray LBRACKET Expression RBRACKET
  3554. //
  3555. // void MakeArrayAccess(void);
  3556. //
  3557.  
  3558. //
  3559. // Rule 242:  PostfixExpression -> Primary
  3560. //
  3561. // void NoAction(void);
  3562. //
  3563.  
  3564. //
  3565. // Rule 243:  PostfixExpression -> Name
  3566. //
  3567. // void NoAction(void);
  3568. //
  3569.  
  3570. //
  3571. // Rule 244:  PostfixExpression -> PostIncrementExpression
  3572. //
  3573. // void NoAction(void);
  3574. //
  3575.  
  3576. //
  3577. // Rule 245:  PostfixExpression -> PostDecrementExpression
  3578. //
  3579. // void NoAction(void);
  3580. //
  3581.  
  3582. // 
  3583. // Rule 246:  PostIncrementExpression ::= PostfixExpression PLUS_PLUS
  3584. //
  3585. #line 4039 "java.g"
  3586. void Parser::Act246(void)
  3587. {
  3588.     AstPostUnaryExpression *p = ast_pool -> NewPostUnaryExpression(AstPostUnaryExpression::PLUSPLUS);
  3589.     p -> expression          = (AstExpression *) Sym(1);
  3590.     p -> post_operator_token = Token(2);
  3591.     Sym(1) = p;
  3592. }
  3593.  
  3594. // 
  3595. // Rule 247:  PostDecrementExpression ::= PostfixExpression MINUS_MINUS
  3596. //
  3597. #line 4051 "java.g"
  3598. void Parser::Act247(void)
  3599. {
  3600.     AstPostUnaryExpression *p = ast_pool -> NewPostUnaryExpression(AstPostUnaryExpression::MINUSMINUS);
  3601.     p -> expression          = (AstExpression *) Sym(1);
  3602.     p -> post_operator_token = Token(2);
  3603.     Sym(1) = p;
  3604. }
  3605.  
  3606. //
  3607. // Rule 248:  UnaryExpression -> PreIncrementExpression
  3608. //
  3609. // void NoAction(void);
  3610. //
  3611.  
  3612. //
  3613. // Rule 249:  UnaryExpression -> PreDecrementExpression
  3614. //
  3615. // void NoAction(void);
  3616. //
  3617.  
  3618. // 
  3619. // Rule 250:  UnaryExpression ::= PLUS UnaryExpression
  3620. //
  3621. #line 4071 "java.g"
  3622. void Parser::Act250(void)
  3623. {
  3624.     AstPreUnaryExpression *p = ast_pool -> NewPreUnaryExpression(AstPreUnaryExpression::PLUS);
  3625.     p -> pre_operator_token = Token(1);
  3626.     p -> expression         = (AstExpression *) Sym(2);
  3627.     Sym(1) = p;
  3628. }
  3629.  
  3630. // 
  3631. // Rule 251:  UnaryExpression ::= MINUS UnaryExpression
  3632. //
  3633. #line 4083 "java.g"
  3634. void Parser::Act251(void)
  3635. {
  3636.     AstPreUnaryExpression *p = ast_pool -> NewPreUnaryExpression(AstPreUnaryExpression::MINUS);
  3637.     p -> pre_operator_token = Token(1);
  3638.     p -> expression         = (AstExpression *) Sym(2);
  3639.     Sym(1) = p;
  3640. }
  3641.  
  3642. //
  3643. // Rule 252:  UnaryExpression -> UnaryExpressionNotPlusMinus
  3644. //
  3645. // void NoAction(void);
  3646. //
  3647.  
  3648. // 
  3649. // Rule 253:  PreIncrementExpression ::= PLUS_PLUS UnaryExpression
  3650. //
  3651. #line 4099 "java.g"
  3652. void Parser::Act253(void)
  3653. {
  3654.     AstPreUnaryExpression *p = ast_pool -> NewPreUnaryExpression(AstPreUnaryExpression::PLUSPLUS);
  3655.     p -> pre_operator_token = Token(1);
  3656.     p -> expression         = (AstExpression *) Sym(2);
  3657.     Sym(1) = p;
  3658. }
  3659.  
  3660. // 
  3661. // Rule 254:  PreDecrementExpression ::= MINUS_MINUS UnaryExpression
  3662. //
  3663. #line 4111 "java.g"
  3664. void Parser::Act254(void)
  3665. {
  3666.     AstPreUnaryExpression *p = ast_pool -> NewPreUnaryExpression(AstPreUnaryExpression::MINUSMINUS);
  3667.     p -> pre_operator_token = Token(1);
  3668.     p -> expression         = (AstExpression *) Sym(2);
  3669.     Sym(1) = p;
  3670. }
  3671.  
  3672. //
  3673. // Rule 255:  UnaryExpressionNotPlusMinus -> PostfixExpression
  3674. //
  3675. // void NoAction(void);
  3676. //
  3677.  
  3678. // 
  3679. // Rule 256:  UnaryExpressionNotPlusMinus ::= TWIDDLE UnaryExpression
  3680. //
  3681. #line 4127 "java.g"
  3682. void Parser::Act256(void)
  3683. {
  3684.     AstPreUnaryExpression *p = ast_pool -> NewPreUnaryExpression(AstPreUnaryExpression::TWIDDLE);
  3685.     p -> pre_operator_token = Token(1);
  3686.     p -> expression         = (AstExpression *) Sym(2);
  3687.     Sym(1) = p;
  3688. }
  3689.  
  3690. // 
  3691. // Rule 257:  UnaryExpressionNotPlusMinus ::= NOT UnaryExpression
  3692. //
  3693. #line 4139 "java.g"
  3694. void Parser::Act257(void)
  3695. {
  3696.     AstPreUnaryExpression *p = ast_pool -> NewPreUnaryExpression(AstPreUnaryExpression::NOT);
  3697.     p -> pre_operator_token = Token(1);
  3698.     p -> expression         = (AstExpression *) Sym(2);
  3699.     Sym(1) = p;
  3700. }
  3701.  
  3702. //
  3703. // Rule 258:  UnaryExpressionNotPlusMinus -> CastExpression
  3704. //
  3705. // void NoAction(void);
  3706. //
  3707.  
  3708. // 
  3709. // Rule 259:  CastExpression ::= LPAREN PrimitiveType Dimsopt RPAREN UnaryExpression
  3710. //
  3711. #line 4155 "java.g"
  3712. void Parser::MakeCastExpression(void)
  3713. {
  3714.     AstCastExpression *p = ast_pool -> NewCastExpression();
  3715.     p -> left_parenthesis_token_opt  = Token(1);
  3716.     p -> type_opt                    = Sym(2);
  3717.     if (Sym(3) != NULL)
  3718.     {
  3719.         AstListNode *tail = (AstListNode *) Sym(3);
  3720.         p -> AllocateBrackets(tail -> index + 1);
  3721.         AstListNode *root = tail;
  3722.         do
  3723.         {
  3724.             root = root -> next;
  3725.             p -> AddBrackets((AstBrackets *) root -> element);
  3726.         } while(root != tail);
  3727.         FreeCircularList(tail);
  3728.     }
  3729.     p -> right_parenthesis_token_opt = Token(4);
  3730.     p -> expression                  = (AstExpression *) Sym(5);
  3731.     Sym(1) = p;
  3732. }
  3733.  
  3734. // 
  3735. // Rule 260:  CastExpression ::= LPAREN Expression RPAREN UnaryExpressionNotPlusMinus
  3736. //
  3737. #line 4181 "java.g"
  3738. void Parser::Act260(void)
  3739.     //
  3740.     // Note that Expression must be a name - i.e., Sym(2) -> isName() == true
  3741.     // This check is not performed here and should be performed during
  3742.     // semantic processing.
  3743.     //
  3744.     AstCastExpression *p = ast_pool -> NewCastExpression();
  3745.     p -> left_parenthesis_token_opt  = Token(1);
  3746.     p -> type_opt                    = Sym(2);
  3747.     p -> right_parenthesis_token_opt = Token(3);
  3748.     p -> expression                  = (AstExpression *) Sym(4);
  3749.     Sym(1) = p;
  3750. }
  3751.  
  3752. //
  3753. // Rule 261:  CastExpression ::= LPAREN Name Dims RPAREN UnaryExpressionNotPlusMinus
  3754. //
  3755. // void MakeCastExpression(void);
  3756. //
  3757.  
  3758. //
  3759. // Rule 262:  MultiplicativeExpression -> UnaryExpression
  3760. //
  3761. // void NoAction(void);
  3762. //
  3763.  
  3764. // 
  3765. // Rule 263:  MultiplicativeExpression ::= MultiplicativeExpression MULTIPLY UnaryExpression
  3766. //
  3767. #line 4211 "java.g"
  3768. void Parser::Act263(void)
  3769. {
  3770.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::STAR);
  3771.     p -> left_expression       = (AstExpression *) Sym(1);
  3772.     p -> binary_operator_token = Token(2);
  3773.     p -> right_expression      = (AstExpression *) Sym(3);
  3774.     Sym(1) = p;
  3775. }
  3776.  
  3777. // 
  3778. // Rule 264:  MultiplicativeExpression ::= MultiplicativeExpression DIVIDE UnaryExpression
  3779. //
  3780. #line 4224 "java.g"
  3781. void Parser::Act264(void)
  3782. {
  3783.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::SLASH);
  3784.     p -> left_expression       = (AstExpression *) Sym(1);
  3785.     p -> binary_operator_token = Token(2);
  3786.     p -> right_expression      = (AstExpression *) Sym(3);
  3787.     Sym(1) = p;
  3788. }
  3789.  
  3790. // 
  3791. // Rule 265:  MultiplicativeExpression ::= MultiplicativeExpression REMAINDER UnaryExpression
  3792. //
  3793. #line 4237 "java.g"
  3794. void Parser::Act265(void)
  3795. {
  3796.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::MOD);
  3797.     p -> left_expression       = (AstExpression *) Sym(1);
  3798.     p -> binary_operator_token = Token(2);
  3799.     p -> right_expression      = (AstExpression *) Sym(3);
  3800.     Sym(1) = p;
  3801. }
  3802.  
  3803. //
  3804. // Rule 266:  AdditiveExpression -> MultiplicativeExpression
  3805. //
  3806. // void NoAction(void);
  3807. //
  3808.  
  3809. // 
  3810. // Rule 267:  AdditiveExpression ::= AdditiveExpression PLUS MultiplicativeExpression
  3811. //
  3812. #line 4254 "java.g"
  3813. void Parser::Act267(void)
  3814. {
  3815.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::PLUS);
  3816.     p -> left_expression       = (AstExpression *) Sym(1);
  3817.     p -> binary_operator_token = Token(2);
  3818.     p -> right_expression      = (AstExpression *) Sym(3);
  3819.     Sym(1) = p;
  3820. }
  3821.  
  3822. // 
  3823. // Rule 268:  AdditiveExpression ::= AdditiveExpression MINUS MultiplicativeExpression
  3824. //
  3825. #line 4267 "java.g"
  3826. void Parser::Act268(void)
  3827. {
  3828.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::MINUS);
  3829.     p -> left_expression       = (AstExpression *) Sym(1);
  3830.     p -> binary_operator_token = Token(2);
  3831.     p -> right_expression      = (AstExpression *) Sym(3);
  3832.     Sym(1) = p;
  3833. }
  3834.  
  3835. //
  3836. // Rule 269:  ShiftExpression -> AdditiveExpression
  3837. //
  3838. // void NoAction(void);
  3839. //
  3840.  
  3841. // 
  3842. // Rule 270:  ShiftExpression ::= ShiftExpression LEFT_SHIFT AdditiveExpression
  3843. //
  3844. #line 4284 "java.g"
  3845. void Parser::Act270(void)
  3846. {
  3847.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::LEFT_SHIFT);
  3848.     p -> left_expression       = (AstExpression *) Sym(1);
  3849.     p -> binary_operator_token = Token(2);
  3850.     p -> right_expression      = (AstExpression *) Sym(3);
  3851.     Sym(1) = p;
  3852. }
  3853.  
  3854. // 
  3855. // Rule 271:  ShiftExpression ::= ShiftExpression RIGHT_SHIFT AdditiveExpression
  3856. //
  3857. #line 4297 "java.g"
  3858. void Parser::Act271(void)
  3859. {
  3860.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::RIGHT_SHIFT);
  3861.     p -> left_expression       = (AstExpression *) Sym(1);
  3862.     p -> binary_operator_token = Token(2);
  3863.     p -> right_expression      = (AstExpression *) Sym(3);
  3864.     Sym(1) = p;
  3865. }
  3866.  
  3867. // 
  3868. // Rule 272:  ShiftExpression ::= ShiftExpression UNSIGNED_RIGHT_SHIFT AdditiveExpression
  3869. //
  3870. #line 4310 "java.g"
  3871. void Parser::Act272(void)
  3872. {
  3873.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::UNSIGNED_RIGHT_SHIFT);
  3874.     p -> left_expression       = (AstExpression *) Sym(1);
  3875.     p -> binary_operator_token = Token(2);
  3876.     p -> right_expression      = (AstExpression *) Sym(3);
  3877.     Sym(1) = p;
  3878. }
  3879.  
  3880. //
  3881. // Rule 273:  RelationalExpression -> ShiftExpression
  3882. //
  3883. // void NoAction(void);
  3884. //
  3885.  
  3886. // 
  3887. // Rule 274:  RelationalExpression ::= RelationalExpression LESS ShiftExpression
  3888. //
  3889. #line 4327 "java.g"
  3890. void Parser::Act274(void)
  3891. {
  3892.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::LESS);
  3893.     p -> left_expression       = (AstExpression *) Sym(1);
  3894.     p -> binary_operator_token = Token(2);
  3895.     p -> right_expression      = (AstExpression *) Sym(3);
  3896.     Sym(1) = p;
  3897. }
  3898.  
  3899. // 
  3900. // Rule 275:  RelationalExpression ::= RelationalExpression GREATER ShiftExpression
  3901. //
  3902. #line 4340 "java.g"
  3903. void Parser::Act275(void)
  3904. {
  3905.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::GREATER);
  3906.     p -> left_expression       = (AstExpression *) Sym(1);
  3907.     p -> binary_operator_token = Token(2);
  3908.     p -> right_expression      = (AstExpression *) Sym(3);
  3909.     Sym(1) = p;
  3910. }
  3911.  
  3912. // 
  3913. // Rule 276:  RelationalExpression ::= RelationalExpression LESS_EQUAL ShiftExpression
  3914. //
  3915. #line 4353 "java.g"
  3916. void Parser::Act276(void)
  3917. {
  3918.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::LESS_EQUAL);
  3919.     p -> left_expression       = (AstExpression *) Sym(1);
  3920.     p -> binary_operator_token = Token(2);
  3921.     p -> right_expression      = (AstExpression *) Sym(3);
  3922.     Sym(1) = p;
  3923. }
  3924.  
  3925. // 
  3926. // Rule 277:  RelationalExpression ::= RelationalExpression GREATER_EQUAL ShiftExpression
  3927. //
  3928. #line 4366 "java.g"
  3929. void Parser::Act277(void)
  3930. {
  3931.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::GREATER_EQUAL);
  3932.     p -> left_expression       = (AstExpression *) Sym(1);
  3933.     p -> binary_operator_token = Token(2);
  3934.     p -> right_expression      = (AstExpression *) Sym(3);
  3935.     Sym(1) = p;
  3936. }
  3937.  
  3938. // 
  3939. // Rule 278:  RelationalExpression ::= RelationalExpression instanceof ReferenceType
  3940. //
  3941. #line 4379 "java.g"
  3942. void Parser::Act278(void)
  3943. {
  3944.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::INSTANCEOF);
  3945.     p -> left_expression       = (AstExpression *) Sym(1);
  3946.     p -> binary_operator_token = Token(2);
  3947.     p -> right_expression      = ast_pool -> NewTypeExpression(Sym(3));
  3948.     Sym(1) = p;
  3949. }
  3950.  
  3951. //
  3952. // Rule 279:  EqualityExpression -> RelationalExpression
  3953. //
  3954. // void NoAction(void);
  3955. //
  3956.  
  3957. // 
  3958. // Rule 280:  EqualityExpression ::= EqualityExpression EQUAL_EQUAL RelationalExpression
  3959. //
  3960. #line 4396 "java.g"
  3961. void Parser::Act280(void)
  3962. {
  3963.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::EQUAL_EQUAL);
  3964.     p -> left_expression       = (AstExpression *) Sym(1);
  3965.     p -> binary_operator_token = Token(2);
  3966.     p -> right_expression      = (AstExpression *) Sym(3);
  3967.     Sym(1) = p;
  3968. }
  3969.  
  3970. // 
  3971. // Rule 281:  EqualityExpression ::= EqualityExpression NOT_EQUAL RelationalExpression
  3972. //
  3973. #line 4409 "java.g"
  3974. void Parser::Act281(void)
  3975. {
  3976.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::NOT_EQUAL);
  3977.     p -> left_expression       = (AstExpression *) Sym(1);
  3978.     p -> binary_operator_token = Token(2);
  3979.     p -> right_expression      = (AstExpression *) Sym(3);
  3980.     Sym(1) = p;
  3981. }
  3982.  
  3983. //
  3984. // Rule 282:  AndExpression -> EqualityExpression
  3985. //
  3986. // void NoAction(void);
  3987. //
  3988.  
  3989. // 
  3990. // Rule 283:  AndExpression ::= AndExpression AND EqualityExpression
  3991. //
  3992. #line 4427 "java.g"
  3993. void Parser::Act283(void)
  3994. {
  3995.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::AND);
  3996.     p -> left_expression       = (AstExpression *) Sym(1);
  3997.     p -> binary_operator_token = Token(2);
  3998.     p -> right_expression      = (AstExpression *) Sym(3);
  3999.     Sym(1) = p;
  4000. }
  4001.  
  4002. //
  4003. // Rule 284:  ExclusiveOrExpression -> AndExpression
  4004. //
  4005. // void NoAction(void);
  4006. //
  4007.  
  4008. // 
  4009. // Rule 285:  ExclusiveOrExpression ::= ExclusiveOrExpression XOR AndExpression
  4010. //
  4011. #line 4444 "java.g"
  4012. void Parser::Act285(void)
  4013. {
  4014.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::XOR);
  4015.     p -> left_expression       = (AstExpression *) Sym(1);
  4016.     p -> binary_operator_token = Token(2);
  4017.     p -> right_expression      = (AstExpression *) Sym(3);
  4018.     Sym(1) = p;
  4019. }
  4020.  
  4021. //
  4022. // Rule 286:  InclusiveOrExpression -> ExclusiveOrExpression
  4023. //
  4024. // void NoAction(void);
  4025. //
  4026.  
  4027. // 
  4028. // Rule 287:  InclusiveOrExpression ::= InclusiveOrExpression OR ExclusiveOrExpression
  4029. //
  4030. #line 4461 "java.g"
  4031. void Parser::Act287(void)
  4032. {
  4033.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::IOR);
  4034.     p -> left_expression       = (AstExpression *) Sym(1);
  4035.     p -> binary_operator_token = Token(2);
  4036.     p -> right_expression      = (AstExpression *) Sym(3);
  4037.     Sym(1) = p;
  4038. }
  4039.  
  4040. //
  4041. // Rule 288:  ConditionalAndExpression -> InclusiveOrExpression
  4042. //
  4043. // void NoAction(void);
  4044. //
  4045.  
  4046. // 
  4047. // Rule 289:  ConditionalAndExpression ::= ConditionalAndExpression AND_AND InclusiveOrExpression
  4048. //
  4049. #line 4478 "java.g"
  4050. void Parser::Act289(void)
  4051. {
  4052.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::AND_AND);
  4053.     p -> left_expression       = (AstExpression *) Sym(1);
  4054.     p -> binary_operator_token = Token(2);
  4055.     p -> right_expression      = (AstExpression *) Sym(3);
  4056.     Sym(1) = p;
  4057. }
  4058.  
  4059. //
  4060. // Rule 290:  ConditionalOrExpression -> ConditionalAndExpression
  4061. //
  4062. // void NoAction(void);
  4063. //
  4064.  
  4065. // 
  4066. // Rule 291:  ConditionalOrExpression ::= ConditionalOrExpression OR_OR ConditionalAndExpression
  4067. //
  4068. #line 4495 "java.g"
  4069. void Parser::Act291(void)
  4070. {
  4071.     AstBinaryExpression *p = ast_pool -> NewBinaryExpression(AstBinaryExpression::OR_OR);
  4072.     p -> left_expression       = (AstExpression *) Sym(1);
  4073.     p -> binary_operator_token = Token(2);
  4074.     p -> right_expression      = (AstExpression *) Sym(3);
  4075.     Sym(1) = p;
  4076. }
  4077.  
  4078. //
  4079. // Rule 292:  ConditionalExpression -> ConditionalOrExpression
  4080. //
  4081. // void NoAction(void);
  4082. //
  4083.  
  4084. // 
  4085. // Rule 293:  ConditionalExpression ::= ConditionalOrExpression QUESTION Expression COLON ConditionalExpression
  4086. //
  4087. #line 4512 "java.g"
  4088. void Parser::Act293(void)
  4089. {
  4090.     AstConditionalExpression *p = ast_pool -> NewConditionalExpression();
  4091.     p -> test_expression  = (AstExpression *) Sym(1);
  4092.     p -> question_token   = Token(2);
  4093.     p -> true_expression  = (AstExpression *) Sym(3);
  4094.     p -> colon_token      = Token(4);
  4095.     p -> false_expression = (AstExpression *) Sym(5);
  4096.     Sym(1) = p;
  4097. }
  4098.  
  4099. //
  4100. // Rule 294:  AssignmentExpression -> ConditionalExpression
  4101. //
  4102. // void NoAction(void);
  4103. //
  4104.  
  4105. //
  4106. // Rule 295:  AssignmentExpression -> Assignment
  4107. //
  4108. // void NoAction(void);
  4109. //
  4110.  
  4111. // 
  4112. // Rule 296:  Assignment ::= LeftHandSide AssignmentOperator AssignmentExpression
  4113. //
  4114. #line 4535 "java.g"
  4115. void Parser::Act296(void)
  4116. {
  4117.     AstAssignmentExpression *p = (AstAssignmentExpression *) Sym(2);
  4118.     p -> left_hand_side = (AstExpression *) Sym(1);
  4119.     p -> expression     = (AstExpression *) Sym(3);
  4120.     Sym(1) = p;
  4121. }
  4122.  
  4123. //
  4124. // Rule 297:  LeftHandSide -> Name
  4125. //
  4126. // void NoAction(void);
  4127. //
  4128.  
  4129. //
  4130. // Rule 298:  LeftHandSide -> FieldAccess
  4131. //
  4132. // void NoAction(void);
  4133. //
  4134.  
  4135. //
  4136. // Rule 299:  LeftHandSide -> ArrayAccess
  4137. //
  4138. // void NoAction(void);
  4139. //
  4140.  
  4141. // 
  4142. // Rule 300:  AssignmentOperator ::= EQUAL
  4143. //
  4144. #line 4559 "java.g"
  4145. void Parser::Act300(void)
  4146. {
  4147.     Sym(1) = ast_pool -> NewAssignmentExpression(AstAssignmentExpression::EQUAL, Token(1));
  4148. }
  4149.  
  4150. // 
  4151. // Rule 301:  AssignmentOperator ::= MULTIPLY_EQUAL
  4152. //
  4153. #line 4568 "java.g"
  4154. void Parser::Act301(void)
  4155. {
  4156.     Sym(1) = ast_pool -> NewAssignmentExpression(AstAssignmentExpression::STAR_EQUAL, Token(1));
  4157. }
  4158.  
  4159. // 
  4160. // Rule 302:  AssignmentOperator ::= DIVIDE_EQUAL
  4161. //
  4162. #line 4577 "java.g"
  4163. void Parser::Act302(void)
  4164. {
  4165.     Sym(1) = ast_pool -> NewAssignmentExpression(AstAssignmentExpression::SLASH_EQUAL, Token(1));
  4166. }
  4167.  
  4168. // 
  4169. // Rule 303:  AssignmentOperator ::= REMAINDER_EQUAL
  4170. //
  4171. #line 4586 "java.g"
  4172. void Parser::Act303(void)
  4173. {
  4174.     Sym(1) = ast_pool -> NewAssignmentExpression(AstAssignmentExpression::MOD_EQUAL, Token(1));
  4175. }
  4176.  
  4177. // 
  4178. // Rule 304:  AssignmentOperator ::= PLUS_EQUAL
  4179. //
  4180. #line 4595 "java.g"
  4181. void Parser::Act304(void)
  4182. {
  4183.     Sym(1) = ast_pool -> NewAssignmentExpression(AstAssignmentExpression::PLUS_EQUAL, Token(1));
  4184. }
  4185.  
  4186. // 
  4187. // Rule 305:  AssignmentOperator ::= MINUS_EQUAL
  4188. //
  4189. #line 4604 "java.g"
  4190. void Parser::Act305(void)
  4191. {
  4192.     Sym(1) = ast_pool -> NewAssignmentExpression(AstAssignmentExpression::MINUS_EQUAL, Token(1));
  4193. }
  4194.  
  4195. // 
  4196. // Rule 306:  AssignmentOperator ::= LEFT_SHIFT_EQUAL
  4197. //
  4198. #line 4613 "java.g"
  4199. void Parser::Act306(void)
  4200. {
  4201.     Sym(1) = ast_pool -> NewAssignmentExpression(AstAssignmentExpression::LEFT_SHIFT_EQUAL, Token(1));
  4202. }
  4203.  
  4204. // 
  4205. // Rule 307:  AssignmentOperator ::= RIGHT_SHIFT_EQUAL
  4206. //
  4207. #line 4622 "java.g"
  4208. void Parser::Act307(void)
  4209. {
  4210.     Sym(1) = ast_pool -> NewAssignmentExpression(AstAssignmentExpression::RIGHT_SHIFT_EQUAL, Token(1));
  4211. }
  4212.  
  4213. // 
  4214. // Rule 308:  AssignmentOperator ::= UNSIGNED_RIGHT_SHIFT_EQUAL
  4215. //
  4216. #line 4631 "java.g"
  4217. void Parser::Act308(void)
  4218. {
  4219.     Sym(1) = ast_pool -> NewAssignmentExpression(AstAssignmentExpression::UNSIGNED_RIGHT_SHIFT_EQUAL, Token(1));
  4220. }
  4221.  
  4222. // 
  4223. // Rule 309:  AssignmentOperator ::= AND_EQUAL
  4224. //
  4225. #line 4640 "java.g"
  4226. void Parser::Act309(void)
  4227. {
  4228.     Sym(1) = ast_pool -> NewAssignmentExpression(AstAssignmentExpression::AND_EQUAL, Token(1));
  4229. }
  4230.  
  4231. // 
  4232. // Rule 310:  AssignmentOperator ::= XOR_EQUAL
  4233. //
  4234. #line 4649 "java.g"
  4235. void Parser::Act310(void)
  4236. {
  4237.     Sym(1) = ast_pool -> NewAssignmentExpression(AstAssignmentExpression::XOR_EQUAL, Token(1));
  4238. }
  4239.  
  4240. // 
  4241. // Rule 311:  AssignmentOperator ::= OR_EQUAL
  4242. //
  4243. #line 4658 "java.g"
  4244. void Parser::Act311(void)
  4245. {
  4246.     Sym(1) = ast_pool -> NewAssignmentExpression(AstAssignmentExpression::IOR_EQUAL, Token(1));
  4247. }
  4248.  
  4249. //
  4250. // Rule 312:  Expression -> AssignmentExpression
  4251. //
  4252. // void NoAction(void);
  4253. //
  4254.  
  4255. //
  4256. // Rule 313:  ConstantExpression -> Expression
  4257. //
  4258. // void NoAction(void);
  4259. //
  4260.  
  4261. // 
  4262. // Rule 314:  PackageDeclarationopt ::=
  4263. //
  4264. #line 4681 "java.g"
  4265. //
  4266. // Given a rule of the form A ::= x1 x2 ... xn
  4267. //
  4268. // Construct a NULL Ast for A.
  4269. //
  4270. void Parser::NullAction(void) { Sym(1) = NULL; }
  4271.  
  4272. //
  4273. // Rule 315:  PackageDeclarationopt -> PackageDeclaration
  4274. //
  4275. // void NoAction(void);
  4276. //
  4277.  
  4278. //
  4279. // Rule 316:  Superopt ::=
  4280. //
  4281. // void NullAction(void);
  4282. //
  4283.  
  4284. //
  4285. // Rule 317:  Superopt -> Super
  4286. //
  4287. // void NoAction(void);
  4288. //
  4289.  
  4290. //
  4291. // Rule 318:  Expressionopt ::=
  4292. //
  4293. // void NullAction(void);
  4294. //
  4295.  
  4296. //
  4297. // Rule 319:  Expressionopt -> Expression
  4298. //
  4299. // void NoAction(void);
  4300. //
  4301.  
  4302. //
  4303. // Rule 320:  ClassBodyopt ::=
  4304. //
  4305. // void NullAction(void);
  4306. //
  4307.  
  4308. //
  4309. // Rule 321:  ClassBodyopt -> ClassBody
  4310. //
  4311. // void NoAction(void);
  4312. //
  4313.  
  4314. //
  4315. // Rule 322:  ,opt ::=
  4316. //
  4317. // void NullAction(void);
  4318. //
  4319.  
  4320. //
  4321. // Rule 323:  ,opt -> COMMA
  4322. //
  4323. // void NoAction(void);
  4324. //
  4325.  
  4326. //
  4327. // Rule 324:  ImportDeclarationsopt ::=
  4328. //
  4329. // void NullAction(void);
  4330. //
  4331.  
  4332. //
  4333. // Rule 325:  ImportDeclarationsopt -> ImportDeclarations
  4334. //
  4335. // void NoAction(void);
  4336. //
  4337.  
  4338. //
  4339. // Rule 326:  TypeDeclarationsopt ::=
  4340. //
  4341. // void NullAction(void);
  4342. //
  4343.  
  4344. //
  4345. // Rule 327:  TypeDeclarationsopt -> TypeDeclarations
  4346. //
  4347. // void NoAction(void);
  4348. //
  4349.  
  4350. //
  4351. // Rule 328:  ClassBodyDeclarationsopt ::=
  4352. //
  4353. // void NullAction(void);
  4354. //
  4355.  
  4356. //
  4357. // Rule 329:  ClassBodyDeclarationsopt -> ClassBodyDeclarations
  4358. //
  4359. // void NoAction(void);
  4360. //
  4361.  
  4362. //
  4363. // Rule 330:  Modifiersopt ::=
  4364. //
  4365. // void NullAction(void);
  4366. //
  4367.  
  4368. //
  4369. // Rule 331:  Modifiersopt -> Modifiers
  4370. //
  4371. // void NoAction(void);
  4372. //
  4373.  
  4374. //
  4375. // Rule 332:  BlockStatementsopt ::=
  4376. //
  4377. // void NullAction(void);
  4378. //
  4379.  
  4380. //
  4381. // Rule 333:  BlockStatementsopt -> BlockStatements
  4382. //
  4383. // void NoAction(void);
  4384. //
  4385.  
  4386. //
  4387. // Rule 334:  Dimsopt ::=
  4388. //
  4389. // void NullAction(void);
  4390. //
  4391.  
  4392. //
  4393. // Rule 335:  Dimsopt -> Dims
  4394. //
  4395. // void NoAction(void);
  4396. //
  4397.  
  4398. //
  4399. // Rule 336:  ArgumentListopt ::=
  4400. //
  4401. // void NullAction(void);
  4402. //
  4403.  
  4404. //
  4405. // Rule 337:  ArgumentListopt -> ArgumentList
  4406. //
  4407. // void NoAction(void);
  4408. //
  4409.  
  4410. //
  4411. // Rule 338:  Throwsopt ::=
  4412. //
  4413. // void NullAction(void);
  4414. //
  4415.  
  4416. //
  4417. // Rule 339:  Throwsopt -> Throws
  4418. //
  4419. // void NoAction(void);
  4420. //
  4421.  
  4422. //
  4423. // Rule 340:  FormalParameterListopt ::=
  4424. //
  4425. // void NullAction(void);
  4426. //
  4427.  
  4428. //
  4429. // Rule 341:  FormalParameterListopt -> FormalParameterList
  4430. //
  4431. // void NoAction(void);
  4432. //
  4433.  
  4434. //
  4435. // Rule 342:  Interfacesopt ::=
  4436. //
  4437. // void NullAction(void);
  4438. //
  4439.  
  4440. //
  4441. // Rule 343:  Interfacesopt -> Interfaces
  4442. //
  4443. // void NoAction(void);
  4444. //
  4445.  
  4446. //
  4447. // Rule 344:  InterfaceMemberDeclarationsopt ::=
  4448. //
  4449. // void NullAction(void);
  4450. //
  4451.  
  4452. //
  4453. // Rule 345:  InterfaceMemberDeclarationsopt -> InterfaceMemberDeclarations
  4454. //
  4455. // void NoAction(void);
  4456. //
  4457.  
  4458. //
  4459. // Rule 346:  ForInitopt ::=
  4460. //
  4461. // void NullAction(void);
  4462. //
  4463.  
  4464. //
  4465. // Rule 347:  ForInitopt -> ForInit
  4466. //
  4467. // void NoAction(void);
  4468. //
  4469.  
  4470. //
  4471. // Rule 348:  ForUpdateopt ::=
  4472. //
  4473. // void NullAction(void);
  4474. //
  4475.  
  4476. //
  4477. // Rule 349:  ForUpdateopt -> ForUpdate
  4478. //
  4479. // void NoAction(void);
  4480. //
  4481.  
  4482. //
  4483. // Rule 350:  ExtendsInterfacesopt ::=
  4484. //
  4485. // void NullAction(void);
  4486. //
  4487.  
  4488. //
  4489. // Rule 351:  ExtendsInterfacesopt -> ExtendsInterfaces
  4490. //
  4491. // void NoAction(void);
  4492. //
  4493.  
  4494. //
  4495. // Rule 352:  Catchesopt ::=
  4496. //
  4497. // void NullAction(void);
  4498. //
  4499.  
  4500. //
  4501. // Rule 353:  Catchesopt -> Catches
  4502. //
  4503. // void NoAction(void);
  4504. //
  4505.  
  4506. // 
  4507. // Rule 354:  PackageHeaderMarker ::=
  4508. //
  4509. #line 4862 "java.g"
  4510. //
  4511. // When this function is invoked, if the "parse_package_header_only" flag
  4512. // is turned on, we skip to the end-of-file token.
  4513. //
  4514. void Parser::Act354(void)
  4515. {
  4516.     if (parse_package_header_only)
  4517.         lex_stream -> Reset(lex_stream -> NumTokens() - 1); // point to the EOF token
  4518.     Sym(1) = NULL;
  4519. }
  4520.  
  4521. // 
  4522. // Rule 355:  MethodHeaderMarker ::=
  4523. //
  4524. #line 4877 "java.g"
  4525. //
  4526. // When this function is invoked, if the "parse_header_only" flag
  4527. // is turned on, the body of the method being parsed is skipped.
  4528. //
  4529. void Parser::Act355(void)
  4530. {
  4531.     if (parse_header_only)
  4532.     {
  4533.         TokenObject token = Token(1);
  4534.  
  4535.         //
  4536.         // If the first token immediately following the method header
  4537.         // is not an open brace, then we have a syntactic error. Do
  4538.         // nothing and let the error recovery take care of it.
  4539.         //
  4540.         if (lex_stream -> Kind(token) == TK_LBRACE)
  4541.             lex_stream -> Reset(lex_stream -> MatchingBrace(token));
  4542.     }
  4543.  
  4544.     Sym(1) = NULL;
  4545. }
  4546.